ดูเหมือนจะมีวิธีการสื่อสารค่อนข้างน้อยระหว่างคำสั่ง สมมติว่าคุณมีคำสั่งซ้อนกันซึ่งคำสั่งภายในต้องสื่อสารบางสิ่งกับภายนอก (เช่นถูกเลือกโดยผู้ใช้)
<outer>
<inner></inner>
<inner></inner>
</outer>
จนถึงตอนนี้ฉันมี 5 วิธีในการทำเช่นนี้
require:
คำสั่งผู้ปกครอง
inner
สั่งสามารถต้องouter
สั่งซึ่งสามารถเปิดเผยวิธีการบางอย่างเกี่ยวกับการควบคุมของตน ดังนั้นในinner
ความหมาย
require: '^outer',
link: function(scope, iElement, iAttrs, outerController) {
// This can be passed to ng-click in the template
$scope.chosen = function() {
outerController.chosen(something);
}
}
และในouter
ตัวควบคุมของคำสั่ง:
controller: function($scope) {
this.chosen = function(something) {
}
}
$emit
เหตุการณ์
inner
สั่งสามารถ$emit
เหตุการณ์ที่สั่งสามารถตอบสนองต่อผ่านทางouter
$on
ดังนั้นในinner
คอนโทรลเลอร์ของ directive:
controller: function($scope) {
$scope.chosen = function() {
$scope.$emit('inner::chosen', something);
}
}
และในouter
ตัวควบคุมคำสั่ง:
controller: function($scope) {
$scope.$on('inner::chosen, function(e, data) {
}
}
ดำเนินการนิพจน์ในขอบเขตพาเรนต์ผ่าน &
ไอเท็มสามารถเชื่อมโยงกับนิพจน์ในขอบเขตพาเรนต์และเรียกใช้งานในจุดที่เหมาะสม HTML จะเป็นเช่น:
<outer>
<inner inner-choose="functionOnOuter(item)"></inner>
<inner inner-choose="functionOnOuter(item)"></inner>
</outer>
ดังนั้นinner
คอนโทรลเลอร์จึงมีฟังก์ชั่น 'InnerChoose' ที่สามารถเรียก
scope: {
'innerChoose': '&'
},
controller: function() {
$scope.click = function() {
$scope.innerChoose({item:something});
}
}
ซึ่งจะเรียก (ในกรณีนี้) ฟังก์ชั่น 'functionOnOuter' ในouter
ขอบเขตของคำสั่ง:
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
การสืบทอดขอบเขตในขอบเขตที่ไม่แยก
เนื่องจากสิ่งเหล่านี้เป็นตัวควบคุมที่ซ้อนกันการสืบทอดขอบเขตสามารถทำงานได้และคำสั่งภายในสามารถเรียกใช้ฟังก์ชันใด ๆ ในห่วงโซ่ขอบเขตได้ตราบใดที่ไม่มีขอบเขตแยกต่างหาก ดังนั้นในinner
คำสั่ง:
// scope: anything but a hash {}
controller: function() {
$scope.click = function() {
$scope.functionOnOuter(something);
}
}
และในouter
คำสั่ง:
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
โดยบริการฉีดเข้าไปทั้งภายในและภายนอก
บริการสามารถถูกฉีดเข้าไปในทั้งสองคำสั่งเพื่อให้พวกเขาสามารถเข้าถึงวัตถุเดียวกันโดยตรงหรือฟังก์ชั่นการโทรเพื่อแจ้งเตือนการบริการและอาจลงทะเบียนตัวเองเพื่อรับการแจ้งเตือนในระบบ pub / sub สิ่งนี้ไม่ต้องการคำสั่งที่จะซ้อนกัน
คำถาม : อะไรคือข้อเสียและข้อได้เปรียบที่เป็นไปได้ของแต่ละรายการ