หากคุณตั้งใจที่จะยึดตัวควบคุมอินสแตนซ์ของส่วนประกอบอื่นไว้แล้วและหากคุณกำลังทำตามแนวทางตามองค์ประกอบ / คำสั่งคุณสามารถrequire
ควบคุม (อินสแตนซ์ของส่วนประกอบ) จากส่วนประกอบอื่นที่เป็นไปตามลำดับชั้นที่กำหนดได้ตลอดเวลา
ตัวอย่างเช่น:
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'
},
...
});
ตอนนี้การใช้ส่วนประกอบข้างต้นเหล่านี้อาจเป็นดังนี้:
<wizard-container ....>
...
<on-boarding-step ...>
</on-boarding-step>
...
</wizard-container>
มีหลายวิธีที่คุณสามารถตั้งค่ามีความจำเป็นต้องใช้
(ไม่มีคำนำหน้า) - ค้นหาตัวควบคุมที่ต้องการในองค์ประกอบปัจจุบัน โยนข้อผิดพลาดหากไม่พบ
เหรอ? - พยายามค้นหาคอนโทรลเลอร์ที่ต้องการหรือส่งค่า null ไปยังลิงก์ fn หากไม่พบ
^ - ค้นหาตัวควบคุมที่ต้องการโดยค้นหาองค์ประกอบและผู้ปกครอง โยนข้อผิดพลาดหากไม่พบ
^^ - ค้นหาตัวควบคุมที่ต้องการโดยค้นหาผู้ปกครองขององค์ประกอบ โยนข้อผิดพลาดหากไม่พบ
? ^ - พยายามค้นหาคอนโทรลเลอร์ที่ต้องการโดยค้นหาองค์ประกอบและพาเรนต์หรือส่งค่า null ไปยังลิงก์ fn หากไม่พบ
? ^^ - พยายามค้นหาคอนโทรลเลอร์ที่ต้องการโดยค้นหาพาเรนต์ขององค์ประกอบหรือส่งค่า null ไปยังลิงก์ fn หากไม่พบ
คำตอบเก่า:
คุณต้องฉีด$controller
บริการเพื่อสร้างอินสแตนซ์คอนโทรลเลอร์ภายในคอนโทรลเลอร์อื่น แต่โปรดทราบว่าสิ่งนี้อาจนำไปสู่ปัญหาการออกแบบบางอย่าง คุณสามารถสร้างบริการที่ใช้ซ้ำได้ตามความรับผิดชอบเดียวและฉีดเข้าไปในตัวควบคุมตามที่คุณต้องการ
ตัวอย่าง:
app.controller('TestCtrl2', ['$scope', '$controller', function ($scope, $controller) {
var testCtrl1ViewModel = $scope.$new();
$controller('TestCtrl1',{$scope : testCtrl1ViewModel });
testCtrl1ViewModel.myMethod();
}]);
ไม่ว่าในกรณีใดคุณไม่สามารถโทรได้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
คือโมเดลมุมมองของคุณจริงๆและในกรณีที่สองเป็นอินสแตนซ์ของตัวควบคุมเอง
TestCtrl1
เป็นบริการแทน