2014-11-25 7 views
1

Я имею следующую директиву:Получить родительский контроллер директивы в директиве ребенка

angular.module('test').directive('childDirective', [function() { 
    return { 
     restrict: 'E', 
     require: '^parentDirective', 
     controller: function() { 
      // How do I get parentDirective's controller? 
     }, 
     link: function($scope, $element, $attrs, $controller) { 
      var data = $controller.parentDirectiveData; 
      .... 
      .... 
     } 
    }; 
}]); 

В функции связи я получаю $ зависимости контроллера, который содержит ссылку на контроллер parentDirective в. Как получить эту ссылку в контроллере childDirective?

ответ

2

У вас есть несколько вариантов, вы можете поставить его на прицел, или сохранить его в переменной, что контроллер может получить доступ также:

angular.module('test').directive('childDirective', [function() { 

    var parentCtrl; 

    return { 
     restrict: 'E', 
     require: '^parentDirective', 
     controller: function() { 
      // parentCtrl will be defined after the link function runs. 
     }, 
     link: function($scope, $element, $attrs, $controller) { 
      var data = $controller.parentDirectiveData; 
      parentCtrl = $controller 
     } 
    }; 
}]); 

Важно Обратите внимание, что функция контроллера будет запустите до функции ссылки, поэтому вы можете использовать ее только в асинхронных обратных вызовах.

Невозможно вставить экземпляр родительского контроллера в дочерний контроллер до этого, поскольку он опирается на директивы, связанные с областью, чтобы определить эту иерархию.

+0

Я ищу «официальный» ответ, но это похоже на обходное решение. – Naor

+3

Обратите внимание на последний абзац. Контроллер, как и любой другой контроллер, вы вводите в него ссылки на вещи, используя инъекцию зависимости углов. Как инжектор узнает, какой экземпляр контроллера родительской директивы вводится (помните, что есть один экземпляр директивы), если вы еще не связали дочернюю директиву с областью действия (происходит в функции связывания и ** определяет ** родителя директивы). Другими словами, официальным ответом является «делать директиву для директивных сообщений в функции связывания». –

+0

Понял. Дело в том, что я работаю с синтаксисом controllerAs, и нет linkAs ... – Naor