12

하위 디렉터 컨트롤러에 액세스하는 방법은 무엇입니까? 특히 상위 디렉티브 내에있는 모든 ngModelController에 액세스해야합니다. 예 : 그래서AngularJS - 하위 디렉터 컨트롤러에 액세스

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

, "모델 1"과 "모델 2"에 대한 ngModelControllers에 대한 액세스 권한을 얻을 수있는 "parentDirective"에 대한 방법은 무엇입니까?

답변

10

업데이트

jqLite extras methods 또한 소자에 관련된 특정 컨트롤러를 검색하는 제어 수단을 갖는다. 따라서 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

감사합니다. 이것이 해결책입니다. crutial 부분은 "return angle.element (el) .data ('$ ngModelController');"입니다. 이 줄은 다음과 같이 작성할 수도 있습니다. "return angle.element (el) .controllwe ('ngModel');". 그 수정과 함께 Plnkr에 링크 http://plnkr.co/edit/shn6978dFkH3YFfkUnRy?p=preview – Christian

+0

오오 그렇습니다. 사실 저는 이것에 대한 jqlite 엑스트라를 잊어 버렸습니다. 감사. 나는 나의 대답을 업데이트 할 것이다. – PSL

관련 문제