Здається, існує досить багато способів комунікації між директивами. Скажімо, ви вклали директиви, де внутрішні директиви повинні щось повідомляти зовнішньому (наприклад, це було обрано користувачем).
<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
контролері директиви:
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
контролер має функцію 'InternalChoose', яку він може викликати
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) {
}
}
Службовим шляхом вводять як внутрішнє, так і зовнішнє
Служба може бути введена в обидві директиви, тому вони можуть мати прямий доступ до одного і того ж об'єкта, або викликати функції для сповіщення служби, а може навіть зареєструватися для отримання сповіщення у паб / підсистемі. Для цього не потрібно вводити директиви.
Запитання : Які можливі недоліки та переваги кожного перед іншими?