$ RootScope को अलग-अलग दायरे वाले निर्देश के टेम्पलेट में एक्सेस क्यों नहीं किया जा सकता है?


81

अलग-अलग स्कोप के साथ निर्देश का टेम्प्लेट कंट्रोलर ('Ctrl') $ rootScope वैरिएबल को एक्सेस करने में सक्षम नहीं लगता है, हालाँकि, जो डायरेक्टर के कंट्रोलर में दिखाई देता है। मुझे समझ में आया कि क्यों नियंत्रक ('Ctrl') $ स्कोप वैरिएबल अलग-अलग स्कोप में दिखाई नहीं देता है।

HTML:

<div ng-app="app">
    <div ng-controller="Ctrl">
        <my-template></my-template>
    </div>

    <script type="text/ng-template" id="my-template.html">
        <label ng-click="test(blah)">Click</label>
    </script>
</div>

जावास्क्रिप्ट:

angular.module('app', [])
    .controller('Ctrl', function Ctrl1($scope,  $rootScope) {
        $rootScope.blah = 'Hello';
        $scope.yah = 'World'
    })
    .directive('myTemplate', function() {
        return {
            restrict: 'E',
            templateUrl: 'my-template.html',
            scope: {},
            controller: ["$scope", "$rootScope", function($scope, $rootScope) {
                console.log($rootScope.blah);
                console.log($scope.yah);,

                $scope.test = function(arg) {
                    console.log(arg);
                }
            }]
        };
    });

JSFiddle

वैरिएबल को अलग-अलग दायरे के साथ एक्सेस किया जाता है - जैसा कि आइसोलेट स्कोप लाइन को कमेंट करके देखा जा सकता है:

        // scope: {},

क्या आपने निर्देश में $ rootScope इंजेक्ट करने की कोशिश की है ... directive('myTemplate', function($rootScope) { ... })?
मार्क क्लाइन

@MarcKline ने बस कोशिश की और कोई भाग्य नहीं।
कैमडेन_कीड


1
क्या कोई कारण है कि किसी सेवा का उपयोग करना आपके उद्देश्यों के लिए पर्याप्त नहीं है?
मार्क क्लाइन

1
@ कल्याण - मुझे लगता है कि $ rootScope का उपयोग केवल घटनाओं और निर्देशों के लिए डेटा पास करने के लिए Factory के लिए किया जाना चाहिए। एक कारण यह है कि $ rootScope का उपयोग करना वैश्विक वैरिएबल का उपयोग करने जैसा है जो आदर्श नहीं है। इसके अलावा, एक फैक्ट्री एक अच्छी तरह से परिभाषित आवरण हो सकती है जिसे बाद की तारीख में बढ़ाया जा सकता है।
कैमडेन_कीड

जवाबों:


164

आप इस तरह से प्रयोग करके देख सकते हैं $root.blah

कार्य कोड

एचटीएमएल

 <label ng-click="test($root.blah)">Click</label>

जावास्क्रिप्ट

  angular.module('app', [])
    .controller('Ctrl', function Ctrl1($scope,  $rootScope) {
        $rootScope.blah = 'Hello';
        $scope.yah = 'World'
    })
    .directive('myTemplate', function() {
        return {
            restrict: 'E',
            templateUrl: 'my-template.html',
            scope: {},
            controller: ["$scope", "$rootScope", function($scope, $rootScope) {
                console.log($rootScope.blah);
                console.log($scope.yah);

                $scope.test = function(arg) {
                    console.log(arg);
                }
            }]
        };
    });

6
मैं इसे उत्तर के रूप में चिह्नित कर रहा हूं क्योंकि यह 'मैं क्या हासिल करना चाहता था' हल करता है (मुझे '$ जड़' का पता नहीं था या यह इस तरह इस्तेमाल किया जा सकता है)। हालांकि , मैं सुझाव दूंगा कि मार्क क्लाइन का जवाब आमतौर पर सबसे अच्छा समाधान है।
कैमडेन_कीड

5
गजब का! यह जानने के लिए काफी उपयोगी है कि $ rootScope विचारों में $ root में बदल जाता है, बहुत बहुत धन्यवाद!
संकट आर

यह सही है क्योंकि मुझे जो करने की ज़रूरत थी वह रूटस्कोप में परिभाषित एक फ़ंक्शन तक पहुंच रहा था
अल्फ्रेडो ए।

अच्छा था। यहां भी काम हो रहा है। क्या आप कृपया बता सकते हैं कि $ रूट के बजाय $ रूटसस्कोप क्यों? मैंने $ rootScope को भी इंजेक्ट किया है लेकिन फ़ंक्शन कॉल करते समय यह अपरिभाषित है।
अज्ञात_कोडर

32

आम तौर पर, आपको उन $rootScopeमूल्यों को संग्रहीत करने के लिए उपयोग करने से बचना चाहिए जिन्हें आपको नियंत्रकों और निर्देशों के बीच साझा करने की आवश्यकता है। यह जेएस में ग्लोबल्स का उपयोग करने जैसा है। इसके बजाय किसी सेवा का उपयोग करें:

एक स्थिर (या मान ... उपयोग समान है):

.constant('blah', 'blah')

https://docs.angularjs.org/api/ng/type/angular.Module

एक कारखाना (या सेवा या प्रदाता):

.factory('BlahFactory', function() {
    var blah = {
        value: 'blah'
    };

    blah.setValue = function(val) {
      this.value = val;
    };

    blah.getValue = function() {
        return this.value;
    };

    return blah;
})

यहाँ आपके फिडेल का एक कांटा है जो यह दर्शाता है कि आप कैसे उपयोग कर सकते हैं


3
+1 इसके लिए बहुत बहुत धन्यवाद और मुझे जो मैं हासिल करने की कोशिश कर रहा हूं उसके लिए सही दिशा में इशारा करने के लिए। मुझे लगता है कि निधिशकृष्णन को मेरी टिप्पणी में बताए गए कारण के लिए 'उत्तर' के रूप में स्वीकार किया जाना चाहिए।
कैमडेन_कीड

1
स्थिरांक के उपयोग के मामले के लिए +1 क्योंकि वे उपयोग किए जाने के लिए दुर्लभ हैं। इसके अलावा $ rootScope का उपयोग नहीं करने पर नोट एक समर्थक टिप था।
फ़रज़ाद YZ

23

1) $scopeअपने कंट्रोलर में अलग-अलग स्कोप की वजह से Ctrl और डायरेक्टरी में कंट्रोलर एक ही स्कोप को रेफर नहीं करते हैं - मान लीजिए कि हमारे पास Ctrl में स्कोप 1 और डायरेक्शन में स्कोप 2 है।

2) क्योंकि अलग दायरे से scope2 नहीं है prototypicallly से विरासत $rootScope; इसलिए यदि आप परिभाषित करते $rootScope.blahहैं कि कोई मौका नहीं है तो आप इसे स्कोप 2 में देख सकते हैं ।

3) आप अपने निर्देशकीय टेम्पलेट में क्या एक्सेस कर सकते हैं गुंजाइश 2 है

अगर मैं इसे समेटता हूं, तो यहां उत्तराधिकार स्कीमा है

    _______|______
    |            |
    V            V
$rootScope     scope2
    |
    V
  scope1


$rootScope.blah
> "Hello"
scope1.blah
> "Hello"
scope2.blah
> undefined

1
बहुत उपयोगी लेकिन nidhishkrishnan का वर्कअराउंड काम करता है अगर किसी भी तरह rootScope मान का उपयोग आवश्यक है। एक अच्छा हैक यह है
मार्क क्लाइन

1
ठीक है, आपने जो कहा है वह यह बताने के लिए तर्क है कि मैं HTML में $ rootScope चर का उपयोग क्यों नहीं कर सकता ($ मूल के बिना।), लेकिन जब मैं $ स्कोप को देखने के लिए बतरंग प्लग-इन का उपयोग करता हूं, तो मैं स्पष्ट रूप से उस $ को देख सकता हूं rootScope अन्य सभी के मूल $ गुंजाइश है (निर्देशों में अलग-अलग गुंजाइश सहित)। इसके अलावा, कोणीय आधिकारिक डॉक्स से परिभाषा में कहा गया है: "हर एप्लिकेशन में एक ही रूट स्कोप होता है। अन्य सभी स्कोप रूट स्कोप के वंशज होते हैं" ( docs.angularjs.org/api/ng/service/$otScope )
IsraelGab

1

मैं यह एक पुराना सवाल जानता हूं। लेकिन इसने इस बारे में मेरी जिज्ञासा को संतुष्ट नहीं किया कि अलग-थलग गुंजाइश $ जड़ों में संपत्ति तक क्यों नहीं पहुंच पाएगी।

इसलिए मैंने कोणीय परिवाद में खोदा और पाया -

$new: function(isolate) {
  var ChildScope,
      child;

  if (isolate) {
    child = new Scope();
    child.$root = this.$root;
    child.$$asyncQueue = this.$$asyncQueue;
    child.$$postDigestQueue = this.$$postDigestQueue;
  } else {

    if (!this.$$childScopeClass) {
      this.$$childScopeClass = function() {
        // blah blah...
      };
      this.$$childScopeClass.prototype = this;
    }
    child = new this.$$childScopeClass();
  }

जब भी कोई नया स्कोप बनता है तो यह कोणीय द्वारा कहा जाता है। यहाँ यह स्पष्ट है कि कोई भी अलग-थलग दायरा मूलरूप से मूलरूप से विरासत में नहीं है। बल्कि नए दायरे में केवल 'रूट' के रूप में जोड़ा गया है। इसलिए हम केवल नए पृथक क्षेत्र में $ जड़ संपत्ति से जड़ों के गुणों का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.