2

У меня есть дочерняя директива, называемая dropDownSortMenu. Элемент в этой дочерней директиве имеет функцию ng-click. После выполнения этой функции я хочу вызвать функцию родительской директивы customTable.Вызов функции в родительской директиве из дочерней директивы

plnkr расположен здесь: http://plnkr.co/edit/7b2mce9jsAXmJpfKjgdx

ответ

1

Я думаю, вы уже были очень близки к правильному подходу. У вас уже был контроллер, но не хватало двух элементов:

  1. Функция сортировки должна быть установлена ​​в контексте контроллера родительского указателя. (т. е. this)
  2. Затем вам необходимо указать require: '^customTable'. (^ используется для обозначения того, что мы ищем контроллер в родительской директиве).

В настоящее время в функции ссылки dropDownSortMenu вы имеете доступ к контексту родительского контроллера и можете делать все, что угодно.

Demo

+0

Благодаря Josh .. это работает – runtimeZero

+0

о господи, твоя гораздо лучше :) –

0

Используйте диспетчер событий прицела; $emit(name, args) используется для отправки события до родительских областей, а $broadcast(name, args) будет передавать события вниз по иерархии.
Чтобы поймать выброшенные события, используйте $on(name, listener) слушателей.

Вы могли бы точно так же относятся к $scope.$parent путешествовать вверх по цепочке (или $scope.$parent.$parent и т.д.), но это не рекомендуется - вы должны смотреть вверх по иерархии области видимости n уровней вверх, что делает этот код жесткой (что, если вы измените уровень вложенности области, например, добавив ng-repeat где-нибудь?).


Вы можете также использовать включение в директиве (при необходимости) - что позволит вашей модели проживать за пределами изолированной сферы действия директивы, таким образом, позволяя естественный доступ к любому контроллеру в иерархии выше (при условии, что нет изолированный объем в пути).
См. $compile service docs для получения информации о директивах 'tranclude.

Смежные вопросы