2012-12-24 21 views
11

से नियंत्रक गुंजाइश तक नहीं पहुंच पा यह मेरा एप्लिकेशन config है:निर्देश

angular.module('myApp', ['myApp.directives', 'myApp.controllers', 'myApp.services']); 

यह मेरा नियंत्रक है:

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

directives.directive("hello", function() { 
    return function (scope, elm, attrs) { 
     elm.text("hello, " + scope[attrs.name]); 
    }; 
}); 

और इस:

angular.module('myApp.controllers', []) 
    .controller('MainCtrl', function ($scope) { 
     $scope.name = 'world'; 
    }); 

यह मेरा निर्देश है मेरा एचटीएमएल है:

<div ng-controller="MainCtrl"> 
    <h1 hello></h1> 
</div> 
दुनिया

क्या गलत है

हैलो:

हैलो, अपरिभाषित

के बजाय:

समस्या यह है कि कोणीय निर्देश के रूप में प्रस्तुत करना है ?

उत्तर

7

आप scope[attrs.name] तक पहुँच रहे हैं लेकिन निर्देश विशेषता के लिए एक मूल्य प्रदान नहीं करता है name

2 विकल्प हैं:

  1. बदलें elm.text("hello, " + scope['name']); को निर्देश इस के रूप में एक पसंदीदा तरीका नहीं है यह एक दायरे के लिए हार्ड कोड संपत्ति नाम

  2. एचटीएमएल को <h1 hello name="name"></h1> पर बदलें। यह बेहतर है, लेकिन मैं यह एक निरर्थक विशेषता का उपयोग करता

मैं तुम्हें elm.text("hello, " + scope[attrs['hello']]);

या और भी बेहतर elm.text("hello, " + scope.$eval(attrs['hello']));

इस तरह से आप के साथ-भाव का लाभ प्राप्त करने के निर्देश बदलने के सुझाव है कि लग रहा है (पूर्व: <h1 hello="name|uppercase"></h1>) demo

इस तरह एचटीएमएलहोगा

एटर्स पैरामीटर के संबंध में: यह डोम तत्व पर मौजूद विशेषताओं से ली गई तारों के मानचित्र से कहीं अधिक कुछ नहीं है।

+0

यह काम नहीं करता। मुझे अभी भी 'अपरिभाषित' मिलता है। – vcardillo

+0

@ vcardillo अच्छी तरह से प्लंकर जोड़ें या एक प्रश्न पूछें :) –

+0

डिबगिंग के बाद, मुझे एहसास हुआ कि मेरी समस्या यह थी कि मैं अपने निर्देश परिभाषा ऑब्जेक्ट में 'स्कोप: {...}' विशेषता का उपयोग कर रहा था, जिससे एक नया पृथक गुंजाइश बना। मैं प्रोटोटाइपिक विरासत को रोक रहा था। – vcardillo

3

आप scope का उपयोग कर एक्सेस कर सकते हैं। देखो http://jsfiddle.net/rPUM5/

directives.directive("hello", function() { 
    return function (scope, elm, attrs) { 
     elm.text("hello, " + scope.name); 
    }; 
});​ 
+0

यह वास्तव में दिलचस्प है, धन्यवाद! मुझे आपके जैसा डॉट सिंटैक्स का उपयोग करने पर बहुत कम दस्तावेज मिला है। – vcardillo

+3

यह वास्तव में गलत है, लिंकिंग फ़ंक्शन पर पास की गई 'स्कोप' ऑब्जेक्ट एक नियंत्रक तत्काल '$ स्कोप 'नहीं है, यह उस दायरे के लिए केवल पढ़ने का संदर्भ है जहां निर्देश तत्काल है जिसे' स्कोप 'द्वारा व्यक्त किया जाना चाहिए । – fiatjaf

+1

किसने कहा कि यह वही है? और आप संभवतः $ स्कोप लिखकर $ स्कोप तक नहीं पहुंच सकते हैं। यह सिर्फ सम्मेलन का उल्लंघन है। दायरे से पहले $ डालकर इसका मतलब यह नहीं है कि यह नियंत्रक का दायरा वस्तु है। – Mahbub

6

तुम कुछ इस लेखन के रूप में, कोणीय में undocumented प्रतीत होता है कि, क्या कर सकते हैं (यहाँ मार्क Rajcok की टिप्पणी देखें: http://docs.angularjs.org/api/ng.$rootScope.Scope)।

अपने निर्देश के भीतर से

:

scope.$parent.name 

आप के निर्देश के इन गुणों scope (निर्देश के भीतर से), तो आप देखेंगे पर एक console.log(scope) करते हैं।

यह सब कहा, मुझे नहीं पता कि यह "उचित" कोणीय सम्मेलन है, इस तथ्य के कारण कि यह दोनों अनियंत्रित है, और मुझे नियंत्रक तक पहुंचने के तरीके पर कोई अन्य बेहतर दस्तावेज नहीं मिला है कि एक निर्देश भीतर बैठता है।

यदि आप एक चर एक Ajax अनुरोध शरीर से आ रही एक्सेस कर रहे हैं, तो आप इंतजार करना जब तक चर सेट है:

1

मैं एक अन्य मामले में पाया गया।

उदाहरण के लिए:

# in controller 
$http.get('/preview').then((response) -> 
    $scope.tabs = response.data.tabs 
    $scope.master_switch = '1' 
    console.info 'after get response in controller' 
) 

# in directive 
directive('masterSwitch', -> 
    (scope, element, attrs) -> 
    alert 'in directive!' # will show before "after get response in controller" 
    console.info scope.master_switch # is undefined 
    setTimeout(-> console.info(scope.master_switch), 50) # => 1 
संबंधित मुद्दे