2015-06-05 13 views
9

की आवश्यकता के लिए निर्देश में "आवश्यकताएं" का उपयोग करने के लिए मैं एक अभिभावक नियंत्रक (निर्देश नहीं) "की आवश्यकता" करने की कोशिश करता हूं लेकिन AngularJS एक अपवाद देता है। कोड इस तरह है:माता-पिता नियंत्रक

जे एस

app.controller("myController", function ($scole) { 
    ... 
}); 

app.directive("myDirective", function ($q) { 
    return { 
     require: "^myController", 
     template: "", 
     link: function (scope, element, attrs, myCtrl) { 
      ... 
     } 
    }; 
}); 

एचटीएमएल

<div ng-controller="myController as myCtrl"> 
    ... 
     <div my-directive>...</div> 
    ... 
</div> 

त्रुटि

Error: [$compile:ctreq] Controller 'myController', required by directive 'myDirective', can't be found!

क्यों?
शायद, require संपत्ति निर्देशक के नियंत्रक के संदर्भ में होना चाहिए?

धन्यवाद

+2

आप सही है कि 'require' संपत्ति अन्य निर्देशों के नियंत्रकों संदर्भित करने के लिए है रहे हैं देखें। – Chev

+0

मुझे संदेह था, लेकिन मुझे यह निश्चितता देने के लिए आधिकारिक दस्तावेज़ीकरण में कुछ भी नहीं मिला। धन्यवाद एलेक्स। – riofly

उत्तर

5

आवश्यकता होती है एक और निर्देश में अन्य निर्देशों नियंत्रकों का उपयोग करने का है, नीचे दिए गए उदाहरण

var App = angular.module('myApp',[]); 

//one directive 

App.directive('oneDirective',function(){ 

    return { 
     restrict: 'E', 
     controller:function($scope){ 

     $scope.myName= function(){ 
      console.log('myname'); 
      } 

     } 
    } 

}); 

    //two directive 

    App.directive('twoDirective',function(){ 

    return { 
     require:'oneDirective' //one directive used, 
     link : function(scope,ele,attrs,oneCtrl){ 
     console.log(oneCtrl.myName()) 
    } 

    } 

    }) 
4

संकेतन require: "^myController" मतलब है कि आपके निर्देश my-controller विशेषता या <my-controller> टैग के रूप में पूर्वज टैग में से कुछ पर एक और निर्देश myController कहा जाता है और परिभाषित का उपयोग करने की कोशिश करेंगे। आपके मामले में आपके पास ऐसा निर्देश नहीं है, इसलिए अपवाद।

यह बहुत पारंपरिक आपको बस इतना करना कोशिश कर रहे हैं नहीं है, लेकिन आप ngController की आवश्यकता कर सकते हैं वास्तव में अपने निर्देश में बाहरी नियंत्रक की आवश्यकता करना चाहते हैं:

app.directive("myDirective", function($q) { 
    return { 
     require: "^ngController", 
     template: "", 
     link: function(scope, element, attrs, myCtrl) { 
      // ... 
      console.log(myCtrl); 
     } 
    }; 
}); 

बहरहाल, यह बहुत अच्छा विचार नहीं है । मैं कल्पना नहीं कर सकता कि आपको इसकी आवश्यकता क्यों हो सकती है। मैं scope कॉन्फ़िगरेशन गुणों और बाहरी नियंत्रक से अपने निर्देश में निष्पादन योग्य फ़ंक्शन संदर्भों को कैसे पारित कर सकता हूं, इसे देखने की अनुशंसा करता हूं।

<div my-directive some-callback="test()"></div> 

और निर्देश में दायरे को परिभाषित:

scope: { 
    someCallback: '&' 
} 

जहां नियंत्रक में आप $scope.test = function() {}; होगा। फिर आपको निर्देश में स्पष्ट रूप से नियंत्रक की आवश्यकता नहीं होगी।

+1

हाँ आवश्यकता सुविधा वास्तव में आप जो करने की कोशिश कर रहे हैं उसके लिए नहीं है। यह एक छोटे नियंत्रक एपीआई के माध्यम से अन्य निर्देशों से बात करने के निर्देशों के लिए है। उदाहरण के लिए, यदि आपको 'ngModel' निर्देश के साथ काम करने के लिए अपने निर्देश की आवश्यकता है तो आप इस सुविधा का उपयोग' ngModel' के नियंत्रक की आवश्यकता के लिए करेंगे ताकि आप इसे छोटे एपीआई की तरह सामान पर कॉल कर सकें। यदि आपको निर्देश और नियंत्रकों के बीच डेटा साझा करने की आवश्यकता है, तो सेवाओं और विभिन्न अलग-अलग दायरे बाध्यकारी वाक्यविन्यासों को देखें। – Chev