12

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

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

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

ответ

10

Обновление

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

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


угловые также размещает контроллер, связанный с элементом на его данных. Аналогично, экземпляр контроллера 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

+1

Спасибо за вашу приверженность. Это решение. Крутильной частью является «return angle.element (el) .data ('$ ngModelController');". Эта строка также может быть записана следующим образом: «return angle.element (el) .controllwe ('ngModel');". Ссылка на ваш Plnkr с этой модификацией http://plnkr.co/edit/shn6978dFkH3YFfkUnRy?p=preview – Christian

+0

О да, я действительно забыл о дополнительных активах jqlite. Благодарю. Я уточню свой ответ. – PSL

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