Dường như có khá nhiều cách để giao tiếp giữa các chỉ thị. Giả sử bạn có các chỉ thị lồng nhau, trong đó các chỉ thị bên trong phải truyền đạt một cái gì đó ra bên ngoài (ví dụ: nó được người dùng chọn).
<outer>
<inner></inner>
<inner></inner>
</outer>
Cho đến nay tôi có 5 cách để làm điều này
require:
chỉ thị của phụ huynh
Lệnh inner
này có thể yêu cầu lệnh outer
, có thể hiển thị một số phương thức trên bộ điều khiển của nó. Vì vậy, trong inner
định nghĩa
require: '^outer',
link: function(scope, iElement, iAttrs, outerController) {
// This can be passed to ng-click in the template
$scope.chosen = function() {
outerController.chosen(something);
}
}
Và trong outer
bộ điều khiển của lệnh:
controller: function($scope) {
this.chosen = function(something) {
}
}
$emit
biến cố
Lệnh inner
có thể $emit
là một sự kiện, mà lệnh outer
có thể đáp ứng, thông qua $on
. Vì vậy, trong inner
bộ điều khiển của lệnh:
controller: function($scope) {
$scope.chosen = function() {
$scope.$emit('inner::chosen', something);
}
}
và trong outer
bộ điều khiển chỉ thị:
controller: function($scope) {
$scope.$on('inner::chosen, function(e, data) {
}
}
Thực hiện biểu thức trong phạm vi cha, thông qua &
Mục này có thể liên kết với một biểu thức trong phạm vi cha và thực hiện nó tại một điểm thích hợp. HTML sẽ như sau:
<outer>
<inner inner-choose="functionOnOuter(item)"></inner>
<inner inner-choose="functionOnOuter(item)"></inner>
</outer>
Vì vậy, inner
bộ điều khiển có chức năng 'InternalChoose' mà nó có thể gọi
scope: {
'innerChoose': '&'
},
controller: function() {
$scope.click = function() {
$scope.innerChoose({item:something});
}
}
mà sẽ gọi (trong trường hợp này) là hàm 'functionOnOuter' trên outer
phạm vi của lệnh:
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
Kế thừa phạm vi trên phạm vi không bị cô lập
Cho rằng đây là các bộ điều khiển lồng nhau, kế thừa phạm vi có thể hoạt động và lệnh bên trong chỉ có thể gọi bất kỳ hàm nào trong chuỗi phạm vi, miễn là nó không có phạm vi tách biệt). Vì vậy, trong inner
chỉ thị:
// scope: anything but a hash {}
controller: function() {
$scope.click = function() {
$scope.functionOnOuter(something);
}
}
Và trong outer
chỉ thị:
controller: function($scope) {
$scope.functionOnOuter = function(item) {
}
}
Bằng dịch vụ tiêm vào cả bên trong và bên ngoài
Một dịch vụ có thể được đưa vào cả hai chỉ thị, vì vậy chúng có thể có quyền truy cập trực tiếp vào cùng một đối tượng hoặc gọi các chức năng để thông báo cho dịch vụ và thậm chí có thể tự đăng ký để được thông báo trong hệ thống quán rượu / phụ. Điều này không yêu cầu các chỉ thị được lồng nhau.
Câu hỏi : Bất kỳ nhược điểm tiềm năng và lợi thế của mỗi so với những người khác là gì?