Nếu ý định của bạn là nắm giữ bộ điều khiển đã được khởi tạo của một thành phần khác và nếu bạn đang theo cách tiếp cận dựa trên thành phần / chỉ thị, bạn luôn có thể require
điều khiển (phiên bản của một thành phần) từ một thành phần khác tuân theo một hệ thống phân cấp nhất định.
Ví dụ:
//some container component that provides a wizard and transcludes the page components displayed in a wizard
myModule.component('wizardContainer', {
...,
controller : function WizardController() {
this.disableNext = function() {
//disable next step... some implementation to disable the next button hosted by the wizard
}
},
...
});
//some child component
myModule.component('onboardingStep', {
...,
controller : function OnboadingStepController(){
this.$onInit = function() {
//.... you can access this.container.disableNext() function
}
this.onChange = function(val) {
//..say some value has been changed and it is not valid i do not want wizard to enable next button so i call container's disable method i.e
if(notIsValid(val)){
this.container.disableNext();
}
}
},
...,
require : {
container: '^^wizardContainer' //Require a wizard component's controller which exist in its parent hierarchy.
},
...
});
Bây giờ việc sử dụng các thành phần trên có thể giống như sau:
<wizard-container ....>
<!--some stuff-->
...
<!-- some where there is this page that displays initial step via child component -->
<on-boarding-step ...>
<!--- some stuff-->
</on-boarding-step>
...
<!--some stuff-->
</wizard-container>
Có nhiều cách bạn có thể thiết lập yêu cầu .
(không có tiền tố) - Định vị bộ điều khiển được yêu cầu trên phần tử hiện tại. Ném lỗi nếu không tìm thấy.
? - Cố gắng xác định vị trí bộ điều khiển cần thiết hoặc chuyển null vào liên kết fn nếu không tìm thấy.
^ - Định vị bộ điều khiển được yêu cầu bằng cách tìm kiếm phần tử và cha mẹ của nó. Ném lỗi nếu không tìm thấy.
^^ - Định vị bộ điều khiển cần thiết bằng cách tìm kiếm cha mẹ của phần tử. Ném lỗi nếu không tìm thấy.
? ^ - Cố gắng xác định vị trí bộ điều khiển cần thiết bằng cách tìm kiếm phần tử và cha của nó hoặc chuyển null vào liên kết fn nếu không tìm thấy.
? ^^ - Cố gắng định vị bộ điều khiển cần thiết bằng cách tìm kiếm cha mẹ của phần tử hoặc chuyển null vào liên kết fn nếu không tìm thấy.
Câu trả lời cũ:
Bạn cần chèn $controller
dịch vụ để khởi tạo một bộ điều khiển bên trong một bộ điều khiển khác. Nhưng lưu ý rằng điều này có thể dẫn đến một số vấn đề về thiết kế. Bạn luôn có thể tạo các dịch vụ có thể sử dụng lại tuân theo Trách nhiệm duy nhất và đưa chúng vào bộ điều khiển khi bạn cần.
Thí dụ:
app.controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) {
var testCtrl1ViewModel = $scope.$new(); //You need to supply a scope while instantiating.
//Provide the scope, you can also do $scope.$new(true) in order to create an isolated scope.
//In this case it is the child scope of this scope.
$controller('TestCtrl1',{$scope : testCtrl1ViewModel });
testCtrl1ViewModel.myMethod(); //And call the method on the newScope.
}]);
Trong mọi trường hợp, bạn không thể gọi TestCtrl1.myMethod()
vì bạn đã đính kèm phương thức trên $scope
và không phải trên phiên bản controller.
Nếu bạn đang chia sẻ bộ điều khiển, thì tốt hơn hết là bạn nên làm: -
.controller('TestCtrl1', ['$log', function ($log) {
this.myMethod = function () {
$log.debug("TestCtrl1 - myMethod");
}
}]);
và trong khi tiêu dùng làm:
.controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) {
var testCtrl1ViewModel = $controller('TestCtrl1');
testCtrl1ViewModel.myMethod();
}]);
Trong trường hợp đầu tiên thực sự $scope
là mô hình chế độ xem của bạn, và trong trường hợp thứ hai, đó là chính thể hiện bộ điều khiển.
TestCtrl1
thành một dịch vụ thay thế.