캔 어 앵글JS 컨트롤러는 같은 모듈의 다른 컨트롤러로부터 상속받습니까?
모듈 내에서 컨트롤러는 외부 컨트롤러에서 속성을 상속할 수 있습니다.
var app = angular.module('angularjs-starter', []);
var ParentCtrl = function ($scope, $location) {
};
app.controller('ChildCtrl', function($scope, $injector) {
$injector.invoke(ParentCtrl, this, {$scope: $scope});
});
예: 데드 링크:
http://blog.omkarpatil.com/2013/02/controller-inheritance-in-angularjs.html
모듈 내의 컨트롤러도 형제로부터 상속받을 수 있습니까?
var app = angular.module('angularjs-starter', []);
app.controller('ParentCtrl ', function($scope) {
//I'm the sibling, but want to act as parent
});
app.controller('ChildCtrl', function($scope, $injector) {
$injector.invoke(ParentCtrl, this, {$scope: $scope}); //This does not work
});
이후 두 번째 코드는 작동하지 않습니다.$injector.invoke
첫 번째 파라미터로서 함수가 필요하며 에 대한 참조를 찾을 수 없습니다.ParentCtrl
.
네, 가능합니다만, 이 경우,$controller
대신 컨트롤러를 인스턴스화하는 서비스:-
var app = angular.module('angularjs-starter', []);
app.controller('ParentCtrl', function($scope) {
// I'm the sibling, but want to act as parent
});
app.controller('ChildCtrl', function($scope, $controller) {
$controller('ParentCtrl', {$scope: $scope}); //This works
});
컨트롤러 구문을 사용하고 있는 경우는, 다음과 같이 해결합니다.
.controller("BaseGenericCtrl", function ($scope) {
var vm = this;
vm.reload = reload;
vm.items = [];
function reload() {
// this function will come from child controller scope - RESTDataService.getItemsA
this.getItems();
}
})
.controller("ChildCtrl", function ($scope, $controller, RESTDataService) {
var vm = this;
vm.getItems = RESTDataService.getItemsA;
angular.extend(vm, $controller('BaseGenericCtrl', {$scope: $scope}));
})
아쉽게도 사용할 수 없습니다.$controller.call(vm, 'BaseGenericCtrl'...)
, 현재의 콘텍스트를 클로즈로 전달합니다(용).reload()
)의 기능을 사용하기 때문에, 1개의 솔루션만이this
컨텍스트를 동적으로 변경하기 위해 상속된 함수의 내부.
공장이나 서비스를 이용하여 두 컨트롤러 모두에 접근 가능한 기능이나 데이터를 제공해야 한다고 생각합니다.
여기 같은 질문이 있습니다 ---> 각진JS 컨트롤러 상속
gmontague가 이 답변에서 제기한 문제에 대응하여 $controller()를 사용하여 컨트롤러를 상속하고 컨트롤러의 "as" 구문을 사용하는 방법을 찾았습니다.
먼저 발신자 $controller()를 상속할 때 "as" 구문을 사용합니다.
app.controller('ParentCtrl', function(etc...) {
this.foo = 'bar';
});
app.controller('ChildCtrl', function($scope, $controller, etc...) {
var ctrl = $controller('ParentCtrl as parent', {etc: etc, ...});
angular.extend(this, ctrl);
});
그런 다음 HTML 템플릿에서 속성이 부모에 의해 정의되어 있는 경우parent.
부모로부터 상속받은 속성을 검색합니다.자녀에 의해 정의된 경우 를 사용합니다.child.
회수할 수 있습니다.
<div ng-controller="ChildCtrl as child">{{ parent.foo }}</div>
음, 다른 방법으로 한 거야제 경우 다른 컨트롤러에서도 동일한 기능과 속성을 적용할 수 있는 기능을 원했습니다.매개 변수만 빼면 좋았어요.이렇게 하면 ChildCtrls는 모두 $location을 받아야 합니다.
var app = angular.module('angularjs-starter', []);
function BaseCtrl ($scope, $location) {
$scope.myProp = 'Foo';
$scope.myMethod = function bar(){ /* do magic */ };
}
app.controller('ChildCtrl', function($scope, $location) {
BaseCtrl.call(this, $scope, $location);
// it works
$scope.myMethod();
});
궁금하신 분은 승인된 답변의 방법을 사용하여 컴포넌트 컨트롤러를 동일한 방법으로 확장할 수 있습니다.
다음의 어프로치를 사용합니다.
상위 컴포넌트(확장원):
/**
* Module definition and dependencies
*/
angular.module('App.Parent', [])
/**
* Component
*/
.component('parent', {
templateUrl: 'parent.html',
controller: 'ParentCtrl',
})
/**
* Controller
*/
.controller('ParentCtrl', function($parentDep) {
//Get controller
const $ctrl = this;
/**
* On init
*/
this.$onInit = function() {
//Do stuff
this.something = true;
};
});
하위 구성요소(확장 구성요소):
/**
* Module definition and dependencies
*/
angular.module('App.Child', [])
/**
* Component
*/
.component('child', {
templateUrl: 'child.html',
controller: 'ChildCtrl',
})
/**
* Controller
*/
.controller('ChildCtrl', function($controller) {
//Get controllers
const $ctrl = this;
const $base = $controller('ParentCtrl', {});
//NOTE: no need to pass $parentDep in here, it is resolved automatically
//if it's a global service/dependency
//Extend
angular.extend($ctrl, $base);
/**
* On init
*/
this.$onInit = function() {
//Call parent init
$base.$onInit.call(this);
//Do other stuff
this.somethingElse = true;
};
});
여기서 중요한 것은 이름 있는 컨트롤러를 컴포넌트 정의에서 정의하는 것이 아니라 사용하는 것입니다.
승인된 답변에서 설명한 바와 같이 $scope 및 기타 서비스에 대한 부모 컨트롤러의 변경 내용을 "계승"할 수 있습니다.$controller('ParentCtrl', {$scope: $scope, etc: etc});
를 선택합니다.
단, 컨트롤러의 'as' 구문을 사용하는 데 익숙한 경우(예:
<div ng-controller="ChildCtrl as child">{{ child.foo }}</div>
iffoo
컨트롤러로 (「」를 사용하고 있습니다).this.foo = ...
하위 컨트롤러는 액세스 할 수 없습니다.
코멘트에 기재되어 있듯이 $controller의 결과를 스코프에 직접 할당할 수 있습니다.
var app = angular.module('angularjs-starter', []);
app.controller('ParentCtrl ', function(etc...) {
this.foo = 'bar';
});
app.controller('ChildCtrl', function($scope, $controller, etc...) {
var inst = $controller('ParentCtrl', {etc: etc, ...});
// Perform extensions to inst
inst.baz = inst.foo + " extended";
// Attach to the scope
$scope.child = inst;
});
주의: 그런 다음 'as' 부분을 삭제해야 합니다.ng-controller=
템플릿이 아닌 코드로 인스턴스 이름을 지정하기 때문입니다.
" 구문을 "Controller as"와 함께 .vm = this
이치노부모 컨트롤러에 변수를 수정하는 기능이 있는지 문제가 있었습니다.
IProblem Factory와 Salman Abbas의 답변을 사용하여 상위 변수에 접근하기 위해 다음을 수행했습니다.
(function () {
'use strict';
angular
.module('MyApp',[])
.controller('AbstractController', AbstractController)
.controller('ChildController', ChildController);
function AbstractController(child) {
var vm = child;
vm.foo = 0;
vm.addToFoo = function() {
vm.foo+=1;
}
};
function ChildController($controller) {
var vm = this;
angular.extend(vm, $controller('AbstractController', {child: vm}));
};
})();
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-controller="ChildController as childCtrl" layout="column" ng-cloak="" ng-app="MyApp">
<button type="button" ng-click="childCtrl.addToFoo()">
add
</button>
<span>
-- {{childCtrl.foo}} --
</span>
</div>
간단한 JavaScript 상속 메커니즘을 사용할 수 있습니다.또한 .call 메서드를 호출하기 위해 필요한 각도가 있는 서비스를 전달하는 것도 잊지 마십시오.
//simple function (js class)
function baseCtrl($http, $scope, $location, $rootScope, $routeParams, $log, $timeout, $window, modalService) {//any serrvices and your 2
this.id = $routeParams.id;
$scope.id = this.id;
this.someFunc = function(){
$http.get("url?id="+this.id)
.then(success function(response){
....
} )
}
...
}
angular
.module('app')
.controller('childCtrl', childCtrl);
//angular controller function
function childCtrl($http, $scope, $location, $rootScope, $routeParams, $log, $timeout, $window, modalService) {
var ctrl = this;
baseCtrl.call(this, $http, $scope, $location, $rootScope, $routeParams, $log, $timeout, $window, modalService);
var idCopy = ctrl.id;
if($scope.id == ctrl.id){//just for sample
ctrl.someFunc();
}
}
//also you can copy prototype of the base controller
childCtrl.prototype = Object.create(baseCtrl.prototype);
언급URL : https://stackoverflow.com/questions/18461263/can-an-angularjs-controller-inherit-from-another-controller-in-the-same-module
'source' 카테고리의 다른 글
Kafka는 "그룹 구성원이 실제로 소비자 그룹에 가입하기 전에 유효한 멤버 ID를 가지고 있어야 합니다." (0) | 2023.02.17 |
---|---|
React-Router v4를 통한 값 전달 (0) | 2023.02.17 |
스프링 부트: java.lang.NoSch Method Error: javax.servlet.http.Http ServletRequest.getHttpServletMapping()Ljavax/servlet/http/HttpServletMapping; (0) | 2023.02.13 |
WooCommerce - 다운로드 가능한 구매에 대한 배송 비활성화 (0) | 2023.02.13 |
모든 모델 클래스에 JSON 시리얼라이저를 추가하시겠습니까? (0) | 2023.02.13 |