Ако вашето намерение е да се сдобиете с вече инстанциран контролер на друг компонент и ако следвате подход, базиран на компонент/директива, винаги можете да require
контролер (екземпляр на компонент) от друг компонент, който следва определена йерархия.
Например:
//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.
},
...
});
Сега използването на тези горни компоненти може да бъде нещо подобно:
<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>
Има много начини, по които можете да настроите require .
(без префикс) - Намерете необходимия контролер на текущия елемент. Извежда грешка, ако не бъде намерен.
? - Опитайте се да намерите необходимия контролер или подайте null на връзката fn, ако не бъде намерена.
^ - Намерете необходимия контролер, като потърсите елемента и неговите родители. Извежда грешка, ако не бъде намерен.
^^ - Намерете необходимия контролер, като потърсите родителите на елемента. Извежда грешка, ако не бъде намерен.
?^ - Опитайте се да намерите необходимия контролер чрез търсене в елемента и неговите родители или подайте null на връзката fn, ако не бъде намерена.
?^^ - Опитайте се да намерите необходимия контролер чрез търсене на родителите на елемента или подайте null на връзката fn, ако не бъде намерена.
Стар отговор:
Трябва да инжектирате $controller
услуга, за да създадете контролер в друг контролер. Но имайте предвид, че това може да доведе до някои проблеми с дизайна. Винаги можете да създадете услуги за многократна употреба, които следват Единичната отговорност и да ги инжектирате в контролерите, както ви е необходимо.
Пример:
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.
}]);
Във всеки случай не можете да извикате TestCtrl1.myMethod()
, защото сте прикачили метода към $scope
, а не към екземпляра на контролера.
Ако споделяте контролера, винаги би било по-добре да направите: -
.controller('TestCtrl1', ['$log', function ($log) {
this.myMethod = function () {
$log.debug("TestCtrl1 - myMethod");
}
}]);
и докато консумирате правете:
.controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) {
var testCtrl1ViewModel = $controller('TestCtrl1');
testCtrl1ViewModel.myMethod();
}]);
В първия случай наистина $scope
е вашият модел на изглед, а във втория случай това е самият екземпляр на контролера.
person
PSL
schedule
21.08.2014
TestCtrl1
в услуга. - person Sly_cardinal   schedule 21.08.2014