AngularJS - доступ к контроллеру дочерних директив

Как получить доступ к контроллерам дочерних директив? В частности, мне нужно получить доступ ко всем ngModelController (s), которые присутствуют в родительской директиве. Пример:

<parent-directive>
  <input type="text" ng-model="model1"/>
  <input type="text" ng-model="model2"/>
</parent-directive>

Итак, есть ли способ "parentDirective" получить доступ к ngModelControllers для "model1" и "model2"?

Ответ 1

Обновление

jqLite методы дополнительных методов также имеют метод контроллера для извлечения конкретного контроллера, связанного с элементом. Таким образом, вы можете запросить ng-модели и получить имя контроллера как angular.element(el).controller('ngModel').

controller (name) - возвращает контроллер текущего элемента или его родителя. По умолчанию получает контроллер, связанный с директивой ngController. Если имя указано как имя директивы camelCase, тогда будет восстановлен контроллер для этой директивы (например, "ngModel" ).


angular также помещает контроллер, связанный с элементом, в его данные. Аналогично, экземпляр контроллера ngModel, связанный с директивой, доступен с помощью $ngModelController. Таким образом, вы можете получить к нему доступ и использовать экземпляр ngModel для выполнения всех ваших действий. Однако это совершенно нестандартный способ сделать это, потому что $ngModelController недокументирован, и нет гарантии, что реализация не изменится в будущих версиях.

Пример реализации:

.directive('parentDirective', function($timeout){
  return{
    restrict:'E',
    link:function(scope, elm){
      /*Get the elements with the attribute ng-model, in your case this could just be elm.children()*/
      var elms = [].slice.call(elm[0].querySelectorAll('[ng-model]'), 0);

      /*get the ngModelControllerArray*/
      var controllers = elms.map(function(el){ 
          return angular.element(el).controller('ngModel');
          //return angular.element(el).data('$ngModelController');
      });

       /*As a sample implementation i am registering a view value listener for these controller instances*/
       controllers.forEach(function(ngModel){
         ngModel.$viewChangeListeners.push(logViewChange.bind(null, ngModel));
       });

       function logViewChange(ngModel){
           console.log(ngModel.$name, ngModel.$viewValue);
       }
    }
  }
});

Plnkr