Jika maksud Anda adalah untuk mendapatkan kontroler yang sudah dipakai dari komponen lain dan jika Anda mengikuti pendekatan berbasis komponen / direktif, Anda selalu dapat require
mengontrol (turunan komponen) dari komponen lain yang mengikuti hierarki tertentu.
Sebagai contoh:
//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.
},
...
});
Sekarang penggunaan komponen di atas mungkin seperti ini:
<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>
Ada banyak cara untuk mengatur keperluan .
(tanpa awalan) - Temukan pengontrol yang diperlukan pada elemen saat ini. Lempar kesalahan jika tidak ditemukan.
? - Mencoba menemukan pengontrol yang diperlukan atau meneruskan null ke tautan fn jika tidak ditemukan.
^ - Temukan pengontrol yang diperlukan dengan mencari elemen dan induknya. Lempar kesalahan jika tidak ditemukan.
^^ - Temukan pengontrol yang diperlukan dengan mencari orang tua elemen. Lempar kesalahan jika tidak ditemukan.
? ^ - Mencoba menemukan pengontrol yang diperlukan dengan mencari elemen dan induknya atau meneruskan null ke link fn jika tidak ditemukan.
? ^^ - Mencoba menemukan pengontrol yang diperlukan dengan mencari orang tua elemen, atau meneruskan null ke link fn jika tidak ditemukan.
Jawaban Lama:
Anda perlu memasukkan $controller
layanan untuk membuat instance pengontrol di dalam pengontrol lain. Namun ketahuilah bahwa ini mungkin menyebabkan beberapa masalah desain. Anda selalu dapat membuat layanan yang dapat digunakan kembali yang mengikuti Tanggung Jawab Tunggal dan memasukkannya ke dalam pengontrol sesuai kebutuhan.
Contoh:
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.
}]);
Bagaimanapun, Anda tidak dapat memanggil TestCtrl1.myMethod()
karena Anda telah memasang metode pada $scope
dan bukan pada contoh pengontrol.
Jika Anda berbagi pengontrol, maka akan selalu lebih baik untuk melakukan: -
.controller('TestCtrl1', ['$log', function ($log) {
this.myMethod = function () {
$log.debug("TestCtrl1 - myMethod");
}
}]);
dan saat mengkonsumsi lakukan:
.controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) {
var testCtrl1ViewModel = $controller('TestCtrl1');
testCtrl1ViewModel.myMethod();
}]);
Dalam kasus pertama $scope
adalah model tampilan Anda, dan dalam kasus kedua adalah contoh pengontrol itu sendiri.
TestCtrl1
ke layanan.