2015-01-05 5 views
5

तो भीतर माता पिता दायरे तक पहुँचने के लिए, आप को परिभाषित कर सकते टोबियास और जेफकैसे कोणीय प्रलेखन वेबसाइट पर एक निर्देश लिंक

angular.module('docsTransclusionExample', []) 
.controller('Controller', ['$scope', function($scope) { 
    $scope.name = 'Tobias'; 
}]) 
.directive('myDialog', function() { 
    return { 
    restrict: 'E', 
    transclude: true, 
    scope: {}, 
    templateUrl: 'my-dialog.html', 
    link: function (scope, element) { 
     scope.name = 'Jeff'; 
    } 
    }; 
}); 

यदि आप नाम है {{नाम}} यह

कहूँगा
The name is Tobias 

मैं लिंक फ़ंक्शन में टोबीस तक पहुंचने का प्रयास कर रहा हूं। लिंक फ़ंक्शन के अंदर से, मुझे $ scope.name मान Tobias के बराबर कैसे मिलेगा?

+2

'$ parent', जवाब है Ufuk Hacıoğulları के जवाब के रूप में, लेकिन दो बार सोचना अगर आप * वास्तव में * ऐसा करना चाहते हैं - यह आपके निर्देश के encapsulation तोड़ता है। पैरामीटर के रूप में इच्छित किसी भी डेटा को पास करना एक बेहतर तरीका है, उदा। 'स्कोप: {parentName: '='} 'और फिर' '। –

+0

धन्यवाद निकोस! निर्देश वर्तमान में दायरे के साथ काम कर रहा है: झूठी और कोई हस्तांतरण नहीं। उस स्थिति में, मैं $ scope.name का उपयोग कैसे करूं? क्या यह सिर्फ $ scope.name होगा? क्या मुझे लिंक फ़ंक्शन के पैरामीटर में $ स्कोप पास करने की आवश्यकता होगी? –

+0

'स्कोप: झूठा' मुझे "संचार" करता है कि निर्देश और उसके माता-पिता के बीच एक आम/फ्लैट "नामस्थान" है। इस मामले में 'नाम' नामक दो "चीजें" को समझ में नहीं आता है - यह पूछना है कि "मेरे पास जेएस फ़ंक्शन में एक ही नाम के साथ 2 'var क्यों नहीं हो सकता है"। मैं जो कहने की कोशिश कर रहा हूं वह यह है कि आपको इस बात पर विचार करना चाहिए कि क्या इसे किसी प्रकार की रीडिज़ाइन की आवश्यकता है। –

उत्तर

3

आप दायरे से $ मूल प्रॉपर्टी का उपयोग करना होगा:

scope.$parent.name = 'Jeff'; 
+0

बहुत बहुत धन्यवाद! क्या आप मुझे बता सकते हैं कि दायरे को डॉलर के संकेत की आवश्यकता क्यों है? यह $ दायरे के बजाय दायरा है। क्या मुझे पैरामीटर में डॉलर का संकेत जोड़ना चाहिए? –

+0

@UXGuy इसे लिंक फ़ंक्शन में इसकी आवश्यकता नहीं है। मैंने इसे अपडेट किया। –

9

के बाद गुंजाइश scope: {}, निर्देश अलग है एक नए बच्चे गुंजाइश पैदा करता है। इस मामले में अभिभावक स्कोप संपत्ति तक सीधे पहुंचने का एकमात्र तरीका दायरे $parent का उपयोग करना है, जो मूल दायरे के ऑब्जेक्ट के संदर्भ में है। उदाहरण के लिए:

link: function(scope, element) { 
    scope.name = 'Jeff'; 
    scope.parentName = scope.$parent.name; // Tobias 
} 

हालांकि यह आदर्श नहीं है। तुम क्यों कुछ इस तरह चाहेगा मैं बस सोच रहा हूँ

scope: { 
    parentName: '=name' 
} 
+0

अच्छा! मैं $ scope.name === टोबियास का उपयोग कैसे करूं यदि दायरा: झूठा? (दायरे के बजाय: {}, स्थानांतरित करें: सत्य) –

+0

यदि 'स्कोप: झूठा' तो निर्देश नया पृथक गुंजाइश नहीं बनाता है, लेकिन इसके बजाय उसी स्कोप का उपयोग करता है जहां इसे परिभाषित किया गया है। इसका मतलब है कि आप 'टोबीस' को 'scope.name' के रूप में एक्सेस कर सकते हैं। – dfsq

+0

कोई डॉलर संकेत नहीं है? क्या मैं अभी भी पैरामीटर के रूप में पैरामीटर या $ स्कोप के रूप में दायरा डालता हूं? तुम्हारी मदद के लिए शुक्रिया! –

1

:

<my-dialog name="name"></my-dialog> 

और के रूप में एक गुंजाइश विन्यास को परिभाषित: यही कारण है कि आप और अधिक लचीला दृष्टिकोण पर विचार कर सकते है।

इस तरह आप नियंत्रक और निर्देश के बीच एक निर्भरता बना रहे हैं जो मौजूद नहीं होना चाहिए।

यदि आपको अपने निर्देश पर इनपुट डेटा की आवश्यकता है, तो इसे स्पष्ट रूप से घोषित करें।

+0

धन्यवाद, एलेक्स। मुझे लगता है कि स्थानांतरण या गुंजाइश नहीं है: {} जो मैं पूरा करने की कोशिश कर रहा हूं उसके लिए आवश्यक हैं। मैं पहले से बनाए गए निर्देश का उपयोग कर रहा हूं जो बिना किसी कार्य के काम करता है: {}। मैं बस सोच रहा हूं कि मेरे निर्देश में नियंत्रक के $ scope.variable मूल्य का उपयोग कैसे करें। –

+2

लेकिन यह बिल्कुल "समस्या" है। जब आप अपने निर्देश के भीतर से मूल दायरे तक पहुंचते हैं, तो आप एक लंबवत बना रहे हैं। यदि आप उस निर्देश को किसी दूसरे पृष्ठ पर एक अलग नियंत्रक के साथ ले जाते हैं तो व्यवहार समान नहीं होगा। आपको हमेशा खोज के माध्यम से निर्देशों के माध्यम से डेटा की आपूर्ति करनी चाहिए, खोज के माध्यम से कभी नहीं। इसका एक अन्य कारण परीक्षण कर रहा है। इस तरह के "deppendencies" को सहेजना आपके निर्देश में परीक्षण लिखना मुश्किल बनाता है। – AlexCode

3

जैसा कि आपने transclude:true का उपयोग किया है, तो यदि आपके पास कोई स्थानीय चर नहीं है तो आप scope:{} निकाल सकते हैं। scope:{} डालना समझ में नहीं आता है।

तो घोषणा

angular.module('docsTransclusionExample', []) 
.controller('Controller', ['$scope', function($scope) { 
    $scope.name = 'Tobias'; 
}]) 
.directive('myDialog', function() { 
    return { 
    restrict: 'E', 
    transclude: true, 
    templateUrl: 'my-dialog.html', 
    link: function (scope, element) { 
     // scope.name = 'Jeff'; 
     // if name is in your parent scope, you should be able to get it here 
     console.log(scope.name); 
    } 
    }; 
}); 

निम्नलिखित क्या आप ng-transclude निर्देश इस्तेमाल किया गया है देखेंगे टेम्पलेट को देखें, तो जैसा होगा, इसका मतलब है जहां टेम्पलेट में माता पिता के दायरे के चर वहाँ इस्तेमाल किया जाएगा। उम्मीद है कि यह समझ में आता है।

+0

धन्यवाद! मुझे यकीन नहीं है कि स्थानांतरण भी जरूरी है लेकिन आप एक अच्छा मुद्दा बनाते हैं! मैंने आशा के साथ यह कोशिश की कि यह मेरी समस्या को ठीक करेगी, और मुझे कंसोल में "अपरिभाषित के कुछ प्रॉपर्टी मूल्य को नहीं पढ़ा जा रहा है"। मेरे पास गुंजाइश है: झूठी और सोचो कि मैंने जो कुछ लिखा है वह कर रहा हूं। मैं दोबारा जांच कर दूंगा ... –

+0

* मुझे यकीन नहीं है कि स्थानांतरण को जरूरी है क्योंकि मैं अभी तक इसे पूरी तरह से समझ नहीं पा रहा हूं और निर्देश ट्रांसफर के बिना काम कर रहा था –

+0

यदि आप ट्रांसफर का उपयोग करते हैं, तो बस स्कोप छोड़ें (झूठी नहीं, बस डॉन इसे मत रखो)। transclude वास्तव में निर्देश में माता-पिता के दायरे लाता है। यदि आप 'ng-repeat' निर्देश के बारे में सोचते हैं जो आपके निर्देश/टेम्पलेट्स के चारों ओर लपेटता है लेकिन आपके पास 'ng-repeat' के दायरे में मौजूद मान लाता है। – Kamrul

3

आप इस तरह $ माता पिता के माध्यम से इसे प्राप्त कर सकते हैं:

link: function (scope, element) { 
    scope.name = 'Jeff'; 
    console.log(scope.name); 
    console.log(scope.$parent.name); 
} 
संबंधित मुद्दे