2013-06-04 6 views
108

मेरे पास दो नियंत्रक हैं जो एक दूसरे के भीतर लपेटे गए हैं। अब मुझे पता है कि बच्चे के दायरे में माता-पिता के दायरे से गुण प्राप्त होते हैं लेकिन क्या माता-पिता के दायरे को अद्यतन करने का कोई तरीका है? अब तक मैं किसी भी स्पष्ट समाधान में नहीं आया है।अद्यतन पैरेंट स्कोप चर

मेरी स्थिति में मेरे पास एक रूप में कैलेंडर नियंत्रक है। मैं मूल दायरे (जो फॉर्म है) से प्रारंभ और समाप्ति तिथियां अपडेट करना चाहता हूं ताकि फॉर्म सबमिट होने पर प्रारंभ और समाप्ति तिथियां हो।

+0

अपने कैलेंडर नियंत्रक की तरह लगता है एक निर्देश होना चाहिए। – Jonah

उत्तर

177

आप माता-पिता दायरे में एक वस्तु (एक आदिम नहीं) का उपयोग करने की जरूरत है और फिर आप बच्चे गुंजाइश

जनक से सीधे इसे अद्यतन करने में सक्षम हो जाएगा:

app.controller('ctrlParent',function($scope){ 
    $scope.parentprimitive = "someprimitive"; 
    $scope.parentobj = {}; 
    $scope.parentobj.parentproperty = "someproperty"; 
}); 

बाल :

app.controller('ctrlChild',function($scope){ 
    $scope.parentprimitive = "this will NOT modify the parent"; //new child scope variable 
    $scope.parentobj.parentproperty = "this WILL modify the parent"; 
}); 

कार्य डेमो: http://jsfiddle.net/sh0ber/xxNxj/

What are the nuances of scope prototypal/prototypical inheritance in AngularJS?

+1

मुझे यह त्रुटि तब मिलती है जब मैं इसे लागू करने का प्रयास करता हूं: 'अपरिभाषित' संपत्ति 'पेरेंटप्रोपर्टी' सेट नहीं कर सकता '। – Malcr001

+0

क्या आप अपना कोड पोस्ट कर सकते हैं? यह बेवकूफ डेमो में काम कर रहा है। यदि आपका कैलेंडर नियंत्रण अलग-अलग दायरे का उपयोग करता है, तो यह मूल दायरे से प्राप्त नहीं होगा, इसलिए आपको निर्देश के दायरे में मूल्य को पारित करने की आवश्यकता होगी। – sh0ber

+0

क्षमा करें मैं इस प्रश्न के बारे में भूल गया। मैंने इसे स्वीकार कर लिया है क्योंकि अंत में मैंने इसे इस उत्तर की मदद से काम करने के लिए प्रबंधित किया था। – Malcr001

4

देखें जब आप एक गुंजाइश के लिए एक आदिम विशेषता निर्दिष्ट करते हैं, यह हमेशा गुंजाइश (संभवतः मक्खी पर बनाया) के लिए स्थानीय है, भले ही एक माता पिता के दायरे के साथ एक विशेषता है एक ही नाम। यह एक डिजाइन निर्णय है, और एक अच्छा आईएमएचओ है।

आप दृश्य से, माता पिता के दायरे में कुछ आदिम (ints, बूलियन्स, तार) को बदलने की जरूरत है, तो आप यह है कि क्षेत्र में किसी अन्य वस्तु की एक विशेषता होने की जरूरत है, इसलिए काम पढ़ सकते हैं:

<a ng-click="viewData.myAttr = 4">Click me!</a> 

और यह, बारी में होगा:

  1. जो कुछ गुंजाइश वह अपने myAttr विशेषता में
  2. असाइन 4 परिभाषित किया गया है से viewData वस्तु मिलता है।
5

यह भी काम करता है (लेकिन यकीन नहीं है कि क्या यह सबसे अच्छा अभ्यास है या नहीं इस प्रकार)

app.controller('ctrlParent',function($scope) { 
    $scope.simpleValue = 'x'; 
}); 

app.controller('ctrlChild',function($scope){ 
    $scope.$parent.simpleValue = 'y'; 
}); 
+1

आप $ scope का उपयोग कर सही हैं। $ Parent.value ज्यादातर मामलों में काम करेगा, हालांकि आमतौर पर बड़े पैमाने पर उपयोग करने का सबसे अच्छा विचार नहीं है क्योंकि इसे बड़ी, अधिक जटिल परियोजनाओं में प्रबंधित करना मुश्किल हो सकता है। –

104

एक और तरीका यह काम करने के लिए नहीं है और $scope.$parent चर का उपयोग नहीं करने के लिए।

केवल मूल दायरे में मूल्य बदलने और इसे बच्चे में उपयोग करने के लिए एक विधि तैयार करें। इस तरह:

app.controller('ctrlParent',function($scope) { 
    $scope.simpleValue = 'x'; 
    $scope.changeSimpleValue = function(newVal) { 
    $scope.simpleValue = newVal; 
    }; 
}); 

app.controller('ctrlChild',function($scope){ 
    $scope.changeSimpleValue('y'); 
}); 

यह भी काम करता है और मूल्य परिवर्तनों पर आपको अधिक नियंत्रण देता है।

फिर आप एचटीएमएल में भी विधि को कॉल कर सकते हैं जैसे: <a ng-click="changeSimpleValue('y')" href="#">click me!</a>

+10

मुझे नहीं पता कि यह जवाब अधिक अपवर्तित क्यों नहीं मिलता है, यह एक अच्छा सुझाव है। – JBCP

+0

उत्कृष्ट जवाब !! –

+0

कमाल का जवाब !!! – zuozuo

2

चर माता पिता में घोषित तक पहुँचने के लिए, हम बच्चे नियंत्रक या टेम्पलेट फ़ाइल में $ माता-पिता का उपयोग करना चाहिए

नियंत्रक

$scope.$parent.varaiable_name 

एचटीएमएल टेम्पलेट में

ng-model="$parent.varaiable_name"