2013-02-27 110 views
9

मेरी rootscope में से संशोधित $ rootscope संपत्ति मैं एक visible संपत्ति जो एक div की दृश्यता को नियंत्रित करता हैअलग नियंत्रकों

app.run(function ($rootScope) { 
    $rootScope.visible = false; 
}); 

उदाहरण HTML है:

<section ng-controller='oneCtrl'> 
    <button ng-click='toggle()'>toggle</button> 
    <div ng-show='visible'> 
     <button ng-click='toggle()'>&times;</button> 
    </div> 
</section> 

नियंत्रक:

var oneCtrl = function($scope){ 
    $scope.toggle = function() { 
     $scope.visible = !$scope.visible; 
    }; 
} 

उपर्युक्त अनुभाग ठीक काम करता है, तत्व बिना किसी समस्या के दिखाया या छुपाया जाता है। अब एक ही पृष्ठ में एक ही खंड में मैं div को दिखाने के लिए visible चर बदलने के लिए प्रयास करता हूं लेकिन यह काम नहीं करता है।

<section ng-controller='otherCtrl'> 
    <button ng-click='showDiv()'>show</button> 
</section> 

नियंत्रक:

var otherCtrl = function($scope){ 
    $scope.showDiv = function() { 
     $scope.visible = true; 
    }; 
} 
+0

क्या आपके पास इसका एक JSFiddle है जिसे हम देख सकते हैं? –

+1

मेरा वास्तविक कोड बड़ा है, यहां केवल एक त्वरित और लघु संस्करण है। – olanod

उत्तर

22

AngularJS में, $scope रों prototypically, अपने माता पिता के दायरे से विरासत $rootScope अप करने के लिए सभी तरह से। जावास्क्रिप्ट में, प्राचीन प्रकार ओवरराइट किए जाते हैं जब कोई बच्चा उन्हें बदलता है। तो जब आप अपने नियंत्रकों में से किसी एक में $scope.visible सेट करते हैं, तो $rootScope पर संपत्ति कभी छू नहीं गई थी, बल्कि एक नई visible संपत्ति वर्तमान दायरे में जोड़ दी गई थी।

एंगुलरजेएस में, दायरे पर मॉडल मूल्यों को हमेशा "एक बिंदु" होना चाहिए, जिसका अर्थ प्राइमेटिव्स के बजाय ऑब्जेक्ट होना चाहिए।

हालांकि, अगर आप भी $rootScope इंजेक्शन लगाने के द्वारा अपने मामले का समाधान कर सकते हैं:

var otherCtrl = function($scope, $rootScope){ 
    $scope.showDiv = function() { 
    $rootScope.visible = true; 
    }; 
} 
+0

मैं नियंत्रक में $ जड़कोप इंजेक्ट नहीं करना चाहता था लेकिन यह काम करता है। – olanod

+0

'$ rootScope' में कोई मान रखना संभवतः सबसे अच्छा समाधान नहीं है। जैसा कि मैंने कहा, यह इस मामले में काम करेगा, लेकिन यह सबसे अच्छा तरीका नहीं हो सकता है। अधिक जानकारी के बिना, हालांकि, यह कहना मुश्किल है कि सबसे अच्छा समाधान क्या होगा। –

1

आप $ गुंजाइश की अवधारणा के साथ कैसे परिचित हैं? यह मुझे आपके कोड के आधार पर देखता है कि आप दो अलग-अलग क्षेत्रों में "दृश्यमान" नामक दो अलग-अलग $ स्कोप चर बनाए रख रहे हैं। क्या आपके प्रत्येक नियंत्रक के पास अपने स्वयं के क्षेत्र हैं? यह अक्सर मामला होता है, जिस स्थिति में आप वास्तव में "दृश्यमान" नामक विभिन्न चर संपादित कर रहे हैं, जब आप $ scope.visible = विभिन्न नियंत्रकों में सत्य करते हैं।

यदि दृश्यमान वास्तव में जड़कोप में है तो आप $ scope.visible के बजाय $ rootScope.visible कर सकते हैं। लेकिन यह एक प्रकार का गन्दा है।

एक विकल्प यह है कि एक निर्देश में "अन्य Ctrl" कोड अनुभाग (आपको शायद यह वही करना चाहिए), और उसके बाद दो-तरफा-निर्देशक दायरे को मूल दायरे में बांधें, जिसे आप read up on here कर सकते हैं। इस तरह निर्देश और पृष्ठ नियंत्रक दोनों एक ही स्कोप ऑब्जेक्ट का उपयोग कर रहे हैं।

अपने $ दायरे को बेहतर तरीके से डीबग करने के लिए, Batarang नामक कोणीय के लिए क्रोम प्लगइन आज़माएं। यह वास्तव में आप अपने सभी क्षेत्रों को पार करते हैं और आपको सही स्थान पर देख रहे हैं, बस उम्मीद के बजाय मॉडल के लिए निर्धारित मॉडल देखें।

+0

धन्यवाद, मैंने सोचा क्योंकि $ rootScope.visible पहले से ही $ scope शुरू किया गया था। दृश्यमान इसका संदर्भ होगा – olanod

+0

नहीं! प्रत्येक नियंत्रक के पास एक अलग $ स्कोप होना चाहिए।$ rootScope सुलभ है, लेकिन वे जिस तरीके से आप वर्णन कर रहे हैं उससे बाध्य नहीं हैं। जब आप निर्देशों को प्राप्त करते हैं तो छोड़कर - फिर आप माता-पिता/बच्चे के दायरे चर को एक साथ जोड़ सकते हैं जिस तरह से आप उनका उपयोग करना चाहते हैं। मैं अभी भी रूट रूटस्कोप का उपयोग करने के खिलाफ अभी भी सिफारिश करता हूं। –

+1

असल में, नियंत्रक स्कोप निर्देशक स्कोप की तरह ही होते हैं, सभी तरह से '$ रूटस्कोप' तक। वे * ओलानोड के रास्ते से बंधे हैं; समस्या यह है कि जावास्क्रिप्ट में, प्रोटोटाइपिकल विरासत का उपयोग करते समय बच्चों में आदिम प्रकार ओवरराइट किए जाते हैं, जो '$ स्कोप' करते हैं। लेकिन मैं इस मामले में '$ रूटस्कोप 'का उपयोग करने की भी सिफारिश करता हूं - सेवाएं शायद बेहतर विकल्प हैं। –