Существует метод, не зависящий от услуг, $broadcast
или $emit
.Это подходит не во всех случаях, но если у вас есть 2 связанных контроллера, которые можно абстрагировать в директивы, то вы можете использовать опцию require
в определении директивы.Это наиболее вероятно, как ngModel и ngForm общаются.Вы можете использовать это для связи между контроллерами директив, которые либо вложены, либо находятся в одном и том же элементе.
Для ситуации родитель / потомок использование будет следующим:
<div parent-directive>
<div inner-directive></div>
</div>
Иосновные моменты, чтобы заставить это работать: в родительской директиве, с методами, которые будут вызваны, вы должны определить их на this
(не на $scope
):
controller: function($scope) {
this.publicMethodOnParentDirective = function() {
// Do something
}
}
В определении дочерней директивы, вы можете использовать опцию require
, чтобы родительский контроллер был передан функции связывания (чтобы вы могли затем вызывать функции из него из scope
дочерней директивы.
require: '^parentDirective',
template: '<span ng-click="onClick()">Click on this to call parent directive</span>',
link: function link(scope, iElement, iAttrs, parentController) {
scope.onClick = function() {
parentController.publicMethodOnParentDirective();
}
}
быть замеченным в http://plnkr.co/edit/poeq460VmQER8Gl9w8Oz?p=preview
Аналогичная директива используется, но обе директивы для одного и того же элемента:
<div directive1 directive2>
</div>
Используется при создании метода в directive1
:
controller: function($scope) {
this.publicMethod = function() {
// Do something
}
}
И в директиве 2 это можно вызвать с помощью опции require
, которая приводит к передаче siblingController в функцию ссылки:
require: 'directive1',
template: '<span ng-click="onClick()">Click on this to call sibling directive1</span>',
link: function link(scope, iElement, iAttrs, siblingController) {
scope.onClick = function() {
siblingController.publicMethod();
}
}
Это можно увидеть в http://plnkr.co/edit/MUD2snf9zvadfnDXq85w?p=preview.
Использование этогоs?
Родитель: Любой случай, когда дочерние элементы должны «зарегистрироваться» у родителя.Очень похоже на отношения между ngModel и ngForm.Это может добавить определенное поведение, которое может повлиять на модели.У вас также может быть что-то чисто на основе DOM, где родительский элемент должен управлять позициями определенных потомков, скажем, управлять прокруткой или реагировать на нее.
Брат: разрешение директиве иметьего поведение изменено.ngModel - классический случай добавления парсеров / проверки к использованию ngModel на входах.