Niyetiniz, başka bir bileşenin halihazırda somutlaştırılmış denetleyicisini elde etmekse ve bileşen / yönerge tabanlı yaklaşımı izliyorsanız, her zaman require
belirli bir hiyerarşiyi izleyen başka bir bileşenden bir denetleyiciyi (bir bileşenin örneği) kullanabilirsiniz.
Örneğin:
myModule.component('wizardContainer', {
...,
controller : function WizardController() {
this.disableNext = function() {
}
},
...
});
myModule.component('onboardingStep', {
...,
controller : function OnboadingStepController(){
this.$onInit = function() {
}
this.onChange = function(val) {
if(notIsValid(val)){
this.container.disableNext();
}
}
},
...,
require : {
container: '^^wizardContainer'
},
...
});
Şimdi yukarıdaki bileşenlerin kullanımı şuna benzer bir şey olabilir:
<wizard-container ....>
...
<on-boarding-step ...>
</on-boarding-step>
...
</wizard-container>
Eğer ayarlayabilirsiniz birçok yolu vardır gerektirir .
(önek yok) - Geçerli öğe üzerinde gerekli denetleyiciyi bulun. Bulunmazsa bir hata atın.
? - Gerekli denetleyiciyi bulmaya veya bulunamazsa fn bağlantısına boş vermeyi deneyin.
^ - Öğeyi ve üst öğelerini arayarak gerekli denetleyiciyi bulun. Bulunmazsa bir hata atın.
^^ - Öğenin üst öğelerini arayarak gerekli denetleyiciyi bulun. Bulunmazsa bir hata atın.
? ^ - Öğeyi ve üst öğelerini arayarak gerekli denetleyiciyi bulmaya çalışın veya bulunamazsa fn bağlantısına null değerini iletin.
? ^^ - Öğenin üst öğelerini arayarak gerekli denetleyiciyi bulmaya çalışın veya bulunamazsa fn bağlantısına null değerini iletin.
Eski Cevap:
$controller
Başka bir denetleyicinin içindeki bir denetleyiciyi örneklemek için hizmet eklemeniz gerekir . Ancak bunun bazı tasarım sorunlarına yol açabileceğini unutmayın. Her zaman Tek Sorumluluğu izleyen yeniden kullanılabilir hizmetler oluşturabilir ve bunları ihtiyaç duyduğunuzda denetleyicilere ekleyebilirsiniz.
Misal:
app.controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) {
var testCtrl1ViewModel = $scope.$new();
$controller('TestCtrl1',{$scope : testCtrl1ViewModel });
testCtrl1ViewModel.myMethod();
}]);
Her durumda TestCtrl1.myMethod()
, yöntemi $scope
denetleyici örneğine değil üzerine eklediğiniz için çağrı yapamazsınız .
Denetleyiciyi paylaşıyorsanız, şunları yapmak her zaman daha iyi olacaktır: -
.controller('TestCtrl1', ['$log', function ($log) {
this.myMethod = function () {
$log.debug("TestCtrl1 - myMethod");
}
}]);
ve tüketirken şunları yapın:
.controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) {
var testCtrl1ViewModel = $controller('TestCtrl1');
testCtrl1ViewModel.myMethod();
}]);
İlk durumda gerçekten $scope
görünüm modeliniz ve ikinci durumda denetleyici örneğinin kendisi.
TestCtrl1
bunun yerine bir hizmete geçmelisiniz .