2013-06-14 11 views
27

में अलग-अलग दायरे तक पहुंच मैं अंगुलरजेएस कस्टम निर्देशों पर पहली कोशिश कर रहा हूं।एंगुलरजेएस - निर्देश के लिंक फ़ंक्शन

मुझे निर्देश के लिंक फ़ंक्शन में अलग-अलग दायरे का उपयोग (या समझने) में समस्या हो रही है।

view.html

... 
<raw-data id="request-data" title="XML of the request" data="request">See the request</raw-data> 
... 

request एक चर viewCtrl के दायरे कि एक अनुरोध के एक्सएमएल-स्ट्रिंग में प्रकाशित है:

यहाँ मेरी एप्लिकेशन के इस हिस्से के कोड है।

rawData.js

directives.directive('rawData', function() { 

    return { 
     restrict : 'E', 
     templateUrl : 'partials/directives/raw-data.html', 
     replace : true, 
     transclude : true, 
     scope : { 
      id : '@', 
      title : '@', 
      data : '=' 
     }, 
     link : function($scope, $elem, $attr) { 
      console.log($scope.data); //the data is correclty printed 
      console.log($scope.id); //undefined 
     } 
    }; 
}); 

कच्चे data.html

<div> 
    <!-- Button to trigger modal --> 
    <a href="#{{id}}Modal" role="button" class="btn" data-toggle="modal" ng-transclude></a> 

    <!-- Modal --> 
    <div id="{{id}}Modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="{{id}}Modal" aria-hidden="true"> 
     <div class="modal-header"> 
      <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> 
      <h3 id="myModalLabel">{{ title }}</h3> 
     </div> 
     <div class="modal-body"> 
      <textarea class="input-block-level" rows="10">{{ data }}</textarea> 
     </div> 
     <div class="modal-footer"> 
      <!-- <button class="btn" ng-click="toggleTagText('')">{{'cacher'}} l'image</button> --> 
      <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true">Fermer</button> 
     </div> 
    </div> 
</div> 

मुझे समझ नहीं आता क्यों आईडी correclty दिखाया गया है जब मोडल पॉप करता, लेकिन जब मैं console.log() के लिए यह कोशिश करते हैं, इसका मूल्य अपरिभाषित है।

शायद मैं अलग-अलग दायरे मूल्य (= और @) के साथ गलत हूं।

पढ़ने के लिए धन्यवाद। :)

+0

यह की कुल अटकलबाजी है, लेकिन है "आईडी" किसी भी तरह विशेष क्योंकि "id" डीओएम और कोणीय का एक मूल हिस्सा उस कारण से आपके निर्देश में इसे ठीक से मानचित्रित नहीं करेगा? क्या आपने यह देखने के लिए उस विशेषता का नाम बदलने की कोशिश की है कि क्या यह बेहतर काम करने में मदद करता है? – blaster

+0

यदि आप एक पहेली (jsfiddle.com/plnkr.co) डाल सकते हैं तो बहुत मदद करता है। –

+0

@blaster: "शीर्षक" के साथ ही हो रहा है और यह डोम का मूल प्रस्ताव नहीं है। :) – pdegand59

उत्तर

34

@ के साथ बाध्य संपत्तियों को अलग करना लिंकिंग फ़ंक्शन में तत्काल उपलब्ध नहीं है। आप $observe उपयोग करने की आवश्यकता:

$attr.$observe('id', function(value) { 
    console.log(value); 
}); 

आपका टेम्पलेट ठीक से काम करता है क्योंकि कोणीय स्वचालित रूप से आप के लिए गुंजाइश संपत्ति id अलग अद्यतन करता है। और जब यह अद्यतन होता है, तो आपका टेम्पलेट स्वचालित रूप से अपडेट भी होता है।

तुम सिर्फ तार गुजर रहे हैं, तो आप बस मूल्यों एक बार मूल्यांकन कर सकते हैं बजाय @ का उपयोग कर बंधन की:,

link: function($scope, $elem, $attr) { 
    var id = $attr.id; 
    var title = $attr.title 
    console.log(id, title); 
} 

हालांकि, आपके मामले में जब से तुम टेम्पलेट्स में गुण का उपयोग करना चाहते हैं, तो आप का उपयोग करना चाहिए @

आप टेम्पलेट का उपयोग कर नहीं कर रहे थे, तो @ जब विशेषता मान {{}} रों – उदाहरण के लिए, title="{{myTitle}}" शामिल उपयोगी है। फिर $observe का उपयोग करने की आवश्यकता अधिक स्पष्ट हो जाती है: आपका लिंकिंग फ़ंक्शन प्रत्येक बार myTitle परिवर्तनों के मान को कुछ भी करना चाहता है।

+0

थीस स्पष्टीकरण के लिए धन्यवाद। मैंने 'console timelog() '' time timeout (function() {...}, 0, सत्य के साथ' console.log() 'को लपेटने का भी प्रयास किया;' और 'scope.id' का मान सही ढंग से सेट किया गया था। जैसा कि आपने कहा था, मैंने '$ attr' ऑब्जेक्ट का उपयोग करने के बारे में सोचा था, लेकिन जैसा कि मुझे टेम्पलेट में मानों की आवश्यकता थी, '@' की आवश्यकता थी। अब सब कुछ इरादे के रूप में काम कर रहा है! :) – pdegand59

+0

क्या आप दो तरह के बाध्य गुणों के लिए $ निरीक्षण का उपयोग करेंगे? जब मैं इसे लॉग करता हूं तो मुझे अपरिभाषित की एक ही समस्या का सामना करना पड़ रहा है, लेकिन यह टेम्पलेट के अंदर काम करता है। गुण मूल गुणों से मॉडल गुण (प्राइमेटिव्स और ऑब्जेक्ट्स) हैं, इसलिए मैं '=' ​​बाध्यकारी कोशिश कर रहा हूं। मूल्य को सही तरीके से लॉग इन करने के लिए आप console.log कैसे प्राप्त करते हैं? – CMCDragonkai

+0

जिस तरह से मॉडल संपत्ति निश्चित रूप से AJAX अनुरोध से पॉप्युलेट की जाती है, इसलिए जब यह शुरू होता है तो यह खाली होता है। – CMCDragonkai

9

यह जानबूझकर है और संकलन आदेश और '@' और '=' के बीच का अंतर है।

this Google Groups discussion with input from Misko से कुछ अंश:

@ and = do very different things. One copies the attribute value (which may be interpolated) and the other treats the attribute value as an expression.

@attrs are not $interpolated until later, so they are not available at link time. If you want to do something with them in the link function you either need to $interpolate yourself manually

+0

+1 ... अच्छा पढ़ें। –

0

ठीक है, वास्तव में ऊपर जवाब में से कोई भी एक प्रमुख पहलू का उल्लेख किया, यहां तक ​​कि '=' के साथ, यह मेरे लिए नहीं लगता है आप लिंक समारोह के अंदर गुंजाइश उपयोग कर सकते हैं सीधे निम्नलिखित की तरह,

scope: { 
    data: '=', 
}, 
link: function(scope, elem, attrs) { 
    console.debug(scope.data); // undefined 

लेकिन आप आंतरिक समारोह में गुंजाइश उपयोग कर सकते हैं,

link: function(scope, elem, attrs) { 
    scope.saveComment = function() { 
     console.debug(scope.data); 

तो ऐसा लगता है कि scope.data उपलब्ध होने पर मुझे समय अंतराल हो सकता है।

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