12

बाल निर्देशक नियंत्रकों तक कैसे पहुंचे? विशेष रूप से, मुझे सभी ngModelController (ओं) तक पहुंचने की आवश्यकता है जो माता-पिता निर्देश के अंदर मौजूद हैं। उदाहरण:एंगुलरजेएस - एक्सेस डायरेक्टिव कंट्रोलर

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

इसलिए, "parentDirective" के लिए एक तरह से "MODEL1" और "MODEL2" के लिए ngModelControllers तक पहुँच प्राप्त करने के लिए है?

उत्तर

10

अद्यतन

jqLite extras methods भी विशिष्ट तत्व से जुड़े नियंत्रक पुनः प्राप्त करने के एक नियंत्रक विधि है। तो आप एनजी-मॉडल के लिए पूछ सकते हैं और नियंत्रक का नाम 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

अपनी प्रतिबद्धता के लिए धन्यवाद। यह समाधान है। क्रूर हिस्सा "वापसी कोणीय.लेमेंट (एल) .डेटा ('$ ngModelController') है;"। इस पंक्ति को भी निम्नानुसार लिखा जा सकता है "वापसी कोणीय.लेमेंट (एल) .controllwe ('ngModel');"। उस संशोधन के साथ अपने Plnkr से लिंक करें http://plnkr.co/edit/shn6978dFkH3YFfkUnRy?p=preview – Christian

+0

ओह हाँ मैं वास्तव में इस पर jqlite एक्स्ट्रा के बारे में भूल गया था। धन्यवाद। मैं अपना जवाब अपडेट करूंगा। – PSL

संबंधित मुद्दे