2013-11-09 4 views
5

मैं एंगुलरजेएस का एक नया उपयोगकर्ता हूं और जब मैं एक नियंत्रक में एक चर से एनजी-दोहराना के अंदर निर्देश से एक चर तक पहुंच प्राप्त करता हूं तो मैं अटक जाता हूं। मुझे लगता है कि इसे स्कॉप्स से संबंधित कुछ होना चाहिए।एनजी-दोहराना के अंदर निर्देश से नियंत्रक दायरे तक कैसे पहुंचे?

यहाँ मेरी बेला है: http://jsfiddle.net/Zzb58/1/

'MyCtrl' गुंजाइश दो गुण है: "आइटम", एक सरणी, और "बात", बस एक स्ट्रिंग।

function MyCtrl($scope) { 
    $scope.items = [{id: 'item1'}, {id: 'item2'}];  
    $scope.thing = "thing"; 
} 

तो, अगर मैं एक निर्देश बना सकते हैं और मैं इसे सरणी की सामग्री पढ़ना चाहते हैं, यह एक पूरी तरह से काम करता है:

<div my-directive ng-repeat="item in items" item='item'></div> 
app.directive('myDirective', function() { 
    return { 
     restrict: 'AE', 
     scope: { 
      item: '=item', 
     }, 
     template: '<div>{{ item.id }}</div>' 
    } 
}); 

एचटीएमएल ठीक से ताज़ा किया जाता है।

लेकिन यदि मैं निर्देश से "चीज़" चर तक पहुंचने का प्रयास करता हूं, तो इसे हमेशा "अपरिभाषित" के रूप में पढ़ा जाता है।

app.directive('myDirective', function() { 
    return { 
     restrict: 'AE', 
     scope: { 
      item: '=item', 
      thing: '=' 
     }, 
     template: '<div>{{ item.id }} - Here is not the {{thing}}</div>' 
    } 
}); 

मुझे लगता है कि समस्या एनजी-दोहराने, या हो सकता है चर सही ढंग से बाध्य नहीं किया जा रहा है में बनाया गुंजाइश बच्चे से संबंधित माना जाता है।

हालांकि, अगर मैं टेम्पलेट में $ parent.thing का उपयोग करता हूं, तो चर को पढ़ा जाता है और इसका मूल्यांकन ठीक से किया जाता है, लेकिन मुझे नहीं पता कि वह $ माता-पिता एनजी-दोहराव का दायरा या 'MyCtrl' गुंजाइश है या नहीं।

1) मैं गलत क्या कर रहा हूं?

2) HTML तत्व की विशेषता के रूप में "आइटम" तत्व को ng-repeat में पढ़ने की आवश्यकता क्यों है? मैंने पहली बार सोचा था कि "आइटम" मूल दायरे में थे, इसलिए जब निर्देश का पृथक गुंजाइश बनाया गया है, तो मुझे बस "आइटम: '='" जैसे कुछ करना होगा।

+1

यदि आप '=' का उपयोग करते हैं तो आपको 'चीज़ = "चीज़" जैसी विशेषता उत्तीर्ण करनी होगी। – elclanrs

उत्तर

4

किसी ऑब्जेक्ट को असाइन करके, आप एक अलग दायरा बनाते हैं। यदि आप scope : true सेट करते हैं, तो आप इसे अपने उदाहरण में उपयोग कर सकते हैं, अगर आपको इसे एक विशेषता के रूप में पास नहीं करना है, जैसे आपने item के साथ किया था।

http://jsfiddle.net/Zzb58/2/

दायरे से अलग प्रकार की एक विवरण के लिए, तो आप इस पेज पर निर्देशों अनुभाग पढ़ सकते हैं: जब विरासत में मिला गुंजाइश मूल्यों के साथ काम करने https://github.com/angular/angular.js/wiki/Understanding-Scopes

आम तौर पर लेकिन विशेष रूप से, मैं भी अत्यधिक का उपयोग कर की सिफारिश करेंगे एक सरल स्ट्रिंग-वेरिएबल की बजाय एक प्रॉपर्टी सेट वाला ऑब्जेक्ट, क्योंकि यह प्रोटोटाइपिकल विरासत कैसे काम करता है, इस वजह से स्कॉप्स में एक पृथक्करण हो सकता है।

+0

यह काम करता है! मुझे लगता है कि मैं स्कॉप्स और जावास्क्रिप्ट प्रोटोटाइप विरासत को समझना शुरू कर रहा हूं ... बहुत बहुत धन्यवाद! – Jorge

+0

आपका स्वागत है (: –

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