AngularJS में वैश्विक चर




global-variables (7)

अगर मैं गलत हूं तो कृपया मुझे सही करें, लेकिन जब कोणीय 2.0 जारी किया जाता है तो मुझे विश्वास नहीं है कि $rootScope चारों ओर होगा। मेरा अनुमान इस तथ्य पर आधारित है कि $scope भी हटा दी जा रही है। स्पष्ट रूप से नियंत्रक, अभी भी मौजूद होंगे, बस ng-controller फैशन में नहीं। इसके बजाय निर्देशकों में निर्देशकों को इंजेक्शन देने का विचार करें। चूंकि रिलीज निकट आता है, यदि आप 1.8 से 2.0 तक स्विच करने के लिए आसान समय चाहते हैं तो वैश्विक चर के रूप में सेवाओं का उपयोग करना सबसे अच्छा होगा।

मुझे एक समस्या है जहां मैं नियंत्रक में दायरे पर एक चर शुरू कर रहा हूं। फिर जब उपयोगकर्ता लॉग इन करता है तो यह किसी अन्य नियंत्रक में बदल जाता है। इस चर का उपयोग नेविगेशन बार जैसी चीजों को नियंत्रित करने के लिए किया जाता है और उपयोगकर्ता के प्रकार के आधार पर साइट के हिस्सों तक पहुंच प्रतिबंधित करता है, इसलिए यह महत्वपूर्ण है कि इसका मूल्य हो। इसके साथ समस्या यह है कि नियंत्रक जो इसे प्रारंभ करता है, फिर से कोणीय द्वारा फिर से कॉल किया जाता है और फिर वैरिएबल को अपने शुरुआती मूल्य पर रीसेट करता है।

मुझे लगता है कि यह वैश्विक चर घोषित करने और शुरू करने का सही तरीका नहीं है, साथ ही यह वास्तव में वैश्विक नहीं है, इसलिए मेरा सवाल यह है कि सही तरीका क्या है और क्या इस काम के आसपास कोणीय के वर्तमान संस्करण के साथ कोई अच्छा उदाहरण है?


आप ऐसा कुछ भी कर सकते हैं ..

function MyCtrl1($scope) {
    $rootScope.$root.name = 'anonymous'; 
}

function MyCtrl2($scope) {
    var name = $rootScope.$root.name;
}

आपके पास "वैश्विक" चर के लिए मूल रूप से 2 विकल्प हैं:

$rootScope सभी scopes का अभिभावक है इसलिए खुलासा किए गए मान सभी टेम्पलेट्स और नियंत्रकों में दिखाई देंगे। $rootScope का उपयोग करना बहुत आसान है क्योंकि आप इसे किसी भी नियंत्रक में इंजेक्ट कर सकते हैं और इस दायरे में मूल्यों को बदल सकते हैं। यह सुविधाजनक हो सकता है लेकिन वैश्विक चर की सभी समस्याएं हैं

सेवाएं सिंगलेट हैं जिन्हें आप किसी भी नियंत्रक से इंजेक्ट कर सकते हैं और नियंत्रकों के दायरे में अपने मूल्यों का पर्दाफाश कर सकते हैं। सेवाएं, सिंगलेट होने के नाते अभी भी 'वैश्विक' हैं लेकिन आप का उपयोग कहीं अधिक बेहतर नियंत्रण प्राप्त हुआ है जहां उनका उपयोग किया जाता है और उनका खुलासा किया जाता है।

सेवाओं का उपयोग करना थोड़ा अधिक जटिल है, लेकिन इतना नहीं, यहां एक उदाहरण है:

var myApp = angular.module('myApp',[]);
myApp.factory('UserService', function() {
  return {
      name : 'anonymous'
  };
});

और फिर एक नियंत्रक में:

function MyCtrl($scope, UserService) {
    $scope.name = UserService.name;
}

यहां काम कर रहा है jsFiddle: http://jsfiddle.net/pkozlowski_opensource/BRWPM/2/


मुझे गलती से एक और तरीका मिला:

मैंने जो किया वह ऐप घोषणा के ऊपर एक var db = null घोषित करना था और उसके बाद इसे app.js में संशोधित किया गया था, तब जब मैंने इसे controller.js में एक्सेस किया था तो मैं बिना किसी समस्या के इसे एक्सेस कर पाया था। इसके साथ कुछ समस्याएं हो सकती हैं जिस विधि के बारे में मुझे पता नहीं है, लेकिन मुझे लगता है कि यह एक अच्छा समाधान है।


विकी पूल में एक और विचार जोड़ने के हित में, लेकिन AngularJS के value और constant मॉड्यूल के बारे में क्या? मैं केवल खुद ही उनका उपयोग करना शुरू कर रहा हूं, लेकिन ऐसा लगता है कि ये शायद यहां सबसे अच्छे विकल्प हैं।

नोट: लिखने के समय के रूप में, कोणीय 1.3.7 नवीनतम स्थिर है, मेरा मानना ​​है कि इन्हें 1.2.0 में जोड़ा गया था, हालांकि इसने चेंजलॉग के साथ इसकी पुष्टि नहीं की है।

इस पर निर्भर करते हुए कि आपको कितने परिभाषित करने की आवश्यकता है, आप उनके लिए एक अलग फ़ाइल बनाना चाहेंगे। लेकिन मैं आम तौर पर आसान पहुंच के लिए अपने ऐप के .config() ब्लॉक से पहले इन्हें परिभाषित करता हूं। चूंकि ये अभी भी प्रभावी रूप से मॉड्यूल हैं, इसलिए आपको उनका उपयोग करने के लिए निर्भरता इंजेक्शन पर भरोसा करना होगा, लेकिन उन्हें आपके ऐप मॉड्यूल पर "वैश्विक" माना जाता है।

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

angular.module('myApp', [])
  .value('debug', true)
  .constant('ENVIRONMENT', 'development')
  .config({...})

फिर किसी भी नियंत्रक के अंदर:

angular.module('myApp')
  .controller('MainCtrl', function(debug, ENVIRONMENT), {
    // here you can access `debug` and `ENVIRONMENT` as straight variables
  })

शुरुआती प्रश्न से वास्तव में स्थिर गुणों की तरह लगता है वैसे भी, यहां पर म्यूटेबल (मान) या अंतिम (स्थिर) के रूप में आवश्यक है। यह किसी और चीज की तुलना में मेरी व्यक्तिगत राय है, लेकिन मुझे $rootScope पर रनटाइम कॉन्फ़िगरेशन आइटम रखने की $rootScope मिलती है। बहुत ही गन्दा हो जाता है।


$rootScope का उपयोग कर AngularJS "वैश्विक चर" का $rootScope :

नियंत्रक 1 वैश्विक चर सेट करता है:

function MyCtrl1($scope, $rootScope) {
    $rootScope.name = 'anonymous'; 
}

नियंत्रक 2 वैश्विक चर पढ़ता है:

function MyCtrl2($scope, $rootScope) {
    $scope.name2 = $rootScope.name; 
}

यहां एक काम कर रहा है jsFiddle: http://jsfiddle.net/natefriedman/3XT3F/1/


localStorage.username = 'blah'

यदि आपको आधुनिक ब्राउज़र पर होने की गारंटी है। हालांकि पता है कि आपके मूल्य सभी तारों में बदल जाएंगे।

रीलोड के बीच कैश होने का आसान लाभ भी है।





global-variables