AngularJS में $scope क्या है? उदाहरण सहित ट्यूटोरियल

⚡ स्मार्ट सारांश

AngularJS में $Scope एक अंतर्निहित ऑब्जेक्ट है जो एक कंट्रोलर को उसके व्यू से जोड़ता है। यह पृष्ठ स्कोप निर्माण, व्यवहार कार्यों, पैरेंट और चाइल्ड पदानुक्रम, $rootScope से अंतर और डाइजेस्ट चक्रों द्वारा बाइंडिंग को रीफ्रेश करने के तरीके के बारे में बताता है।

  • 🔗 बाध्यकारी भूमिका: $scope नियंत्रक से सदस्य चर को दृश्य में ले जाता है, इसलिए टेम्पलेट सीधे DOM को छुए बिना डेटा को रेंडर करते हैं।
  • ⚙️ व्यवहार संबंधी कार्य: जब व्यू को क्लिक, इनपुट परिवर्तन या अन्य उपयोगकर्ता घटनाओं पर प्रतिक्रिया करने की आवश्यकता हो, तो $scope में फ़ंक्शन संलग्न करें।
  • 🌳 कार्यक्षेत्र पदानुक्रम: ng-controller और ng-repeat जैसे निर्देश चाइल्ड स्कोप बनाते हैं जो एप्लिकेशन के DOM ट्री को प्रतिबिंबित करते हैं।
  • 🌍 $rootScope पहुंच: प्रत्येक एप्लिकेशन में एक ही $rootScope मौजूद होता है और यह एक वैश्विक ऑब्जेक्ट की तरह व्यवहार करता है जिसे प्रत्येक चाइल्ड स्कोप पढ़ सकता है।
  • 🔍 पाचन चक्र: $watch लिसनर्स को रजिस्टर करता है, $apply AngularJS एक्जीक्यूशन कॉन्टेक्स्ट में प्रवेश करता है और $digest मॉडल के स्थिर होने तक मूल्यों की तुलना करता है।
  • 🚀 प्रदर्शन की आदत: वॉच एक्सप्रेशंस को किफायती रखें, उनके अंदर DOM एक्सेस से बचें और उन स्कोप्स पर $destroy को कॉल करें जिनकी अब आवश्यकता नहीं है।

AngularJS में $Scope क्या है?

AngularJS में $scope क्या है?

AngularJS में $scope एक अंतर्निहित ऑब्जेक्ट है जो मूल रूप से "कंट्रोलर" और "व्यू" को बांधता है। नियंत्रक के भीतर स्कोप में सदस्य चर को परिभाषित किया जा सकता है जिसे फिर व्यू द्वारा एक्सेस किया जा सकता है।

प्रत्येक नियंत्रक AngularJS एप्लिकेशन को डिपेंडेंसी इंजेक्शन के माध्यम से अपना $scope इंस्टेंस प्राप्त होता है। आप उस ऑब्जेक्ट से जो कुछ भी जोड़ते हैं, वह कंट्रोलर द्वारा नियंत्रित टेम्पलेट को दिखाई देता है, इसलिए $scope एक साझा डेटा मॉडल के रूप में कार्य करता है जो आपके और आपके बीच स्थित होता है। Javaस्क्रिप्ट लॉजिक और आपका HTML मार्कअप।

नीचे दिए गए उदाहरण पर विचार करें:

AngularJS में $scope

angular.module('app',[]).controller('HelloWorldCtrl',
	function($scope)
	{
		$scope.message = "Hello World"
	});

Code स्पष्टीकरण:

  1. मॉड्यूल का नाम “ऐप” है
  2. कंट्रोलर का नाम “HelloWorldCtrl” है।
  3. स्कोप ऑब्जेक्ट मुख्य ऑब्जेक्ट है जिसका उपयोग नियंत्रक से दृश्य तक जानकारी पास करने के लिए किया जाता है।
  4. सदस्य चर को स्कोप ऑब्जेक्ट में जोड़ा गया

⚠️ वाक्यविन्यास संबंधी चेतावनी: RSI .controller() यह मेथड दो आर्गुमेंट लेती है: कंट्रोलर का नाम और फ़ैक्टरी फ़ंक्शन, इसलिए इनके बीच कॉमा लगाना आवश्यक है। 'HelloWorldCtrl' और function($scope)अल्पविराम छोड़ देने से त्रुटि उत्पन्न होती है। Uncaught SyntaxError AngularJS के बूटस्ट्रैप होने से पहले ही।

एक सिंगल कंट्रोलर और एक सिंगल व्यू से आधी तस्वीर ही समझ आती है। असल एप्लीकेशन में कंट्रोलर एक-दूसरे के अंदर होते हैं, लिस्ट दोहराई जाती हैं और विजेट्स का पुन: उपयोग किया जाता है, जिसका मतलब है कि एक ही समय में कई स्कोप मौजूद होते हैं।

AngularJS में स्कोप हायरार्की और इनहेरिटेंस कैसे काम करते हैं

प्रत्येक AngularJS एप्लिकेशन में केवल एक रूट स्कोप होता है और इसमें कितने भी चाइल्ड स्कोप हो सकते हैं। डायरेक्टिव इन चाइल्ड स्कोप को बनाते हैं और उन्हें उस DOM एलिमेंट से जोड़ते हैं जिसे वे डेकोरेट करते हैं, इसलिए स्कोप ट्री रेंडर किए गए पेज की संरचना को प्रतिबिंबित करता है।

जब AngularJS किसी अभिव्यक्ति का मूल्यांकन करता है, जैसे कि {{siteName}}यह सबसे पहले एलिमेंट से जुड़े स्कोप में उस प्रॉपर्टी को खोजता है। यदि प्रॉपर्टी मौजूद नहीं है, तो खोज पैरेंट स्कोप में चली जाती है और रूट स्कोप तक पहुंचने तक ऊपर की ओर बढ़ती रहती है। Javaस्क्रिप्ट डेवलपर्स इस व्यवहार को प्रोटोटाइपल इनहेरिटेंस के रूप में जानते हैं, और चाइल्ड स्कोप ठीक उसी तरह अपने पेरेंट्स से इनहेरिट करते हैं।

नीचे दिए गए उदाहरण में एक कंट्रोलर को दूसरे के अंदर नेस्ट किया गया है ताकि आप इनहेरिटेंस को होते हुए देख सकें।

<div ng-app="scopeDemo">
    <div ng-controller="ParentCtrl">
        Parent scope value: {{siteName}}
        <div ng-controller="ChildCtrl">
            Child reads parent value: {{siteName}}
            Child own value: {{lesson}}
        </div>
    </div>
</div>

<script type="text/javascript">
    var app = angular.module("scopeDemo", []);

    app.controller("ParentCtrl", function($scope) {
        $scope.siteName = "Guru99";
    });

    app.controller("ChildCtrl", function($scope) {
        $scope.lesson = "AngularJS Scope";
    });
</script>

Code स्पष्टीकरण:

  1. ParentCtrl परिभाषित करता है siteName अपने दायरे में।
  2. ChildCtrl कभी परिभाषित नहीं करता siteNameफिर भी, भीतरी div अभी भी प्रिंट करता है Guru99 क्योंकि लुकअप पैरेंट स्कोप तक जाता है।
  3. lesson यह केवल चाइल्ड स्कोप में ही मौजूद रहता है, इसलिए पैरेंट डिव इसे पढ़ नहीं सकता।

कौन से निर्देश एक नया दायरा बनाते हैं?

  • एनजी-कंट्रोलर: यह उस एलिमेंट के लिए चाइल्ड स्कोप बनाता है जिस पर इसे रखा जाता है।
  • एनजी-रिपीट: यह प्रति पुनरावृति एक चाइल्ड स्कोप बनाता है, यही कारण है कि प्रत्येक पंक्ति एक ही अभिव्यक्ति के लिए अलग-अलग मान रख सकती है।
  • अनुकूलित निर्देश: बच्चे के दायरे का अनुरोध कर सकता है, या एक अलग वह स्कोप जो जानबूझकर अपने मूल स्ट्रक्चर से इनहेरिट नहीं करता है।
  • घटक निर्देश: जो कुछ भी पंजीकृत है .component() हेल्पर को हमेशा एक आइसोलेट स्कोप प्राप्त होता है।

क्योंकि चाइल्ड स्कोप ऊपर की ओर पढ़ते हैं, इसलिए डेवलपर्स अक्सर सोचते हैं कि उस श्रृंखला का शीर्ष कहाँ स्थित है। उस शीर्ष स्तर के ऑब्जेक्ट को $rootScope कहा जाता है।

$scope और $rootScope में क्या अंतर है?

एंगुलरजेएस $rootScope $rootScope पूरे एप्लिकेशन का दायरा है। किसी एप्लिकेशन में केवल एक ही $rootScope हो सकता है और इसे वैश्विक चर की तरह उपयोग किया जाता है। प्रत्येक $scope एक चाइल्ड स्कोप होता है, और $rootScope ट्री के शीर्ष पर स्थित पैरेंट होता है। नीचे दी गई तालिका इन दोनों ऑब्जेक्ट्स की तुलना करती है।

पहलू $ गुंजाइश $rootScope
प्रति एप्लिकेशन उदाहरण कई, प्रत्येक नियंत्रक या स्कोप-निर्माण निर्देश के लिए एक बिल्कुल एक
द्वारा निर्मित एनजी-नियंत्रक और एनजी-रिपीट जैसे निर्देश एप्लिकेशन बूटस्ट्रैप के दौरान इंजेक्टर
दर्शनीयता इसका अपना तत्व और इसके सभी वंशज आवेदन में प्रत्येक दायरा
विशिष्ट उपयोग किसी एक दृश्य या किसी एक सूची पंक्ति के लिए डेटा और व्यवहार एप्लिकेशन-व्यापी मान, जैसे कि लॉग इन उपयोगकर्ता
मुख्य जोखिम शाखा के बाहर मान अप्राप्य हो जाते हैं नाम टकराव और छिपे हुए युग्मन, जैसे वैश्विक चर

$rootScope का उपयोग सोच-समझकर करें। इसमें रखी गई कोई भी चीज़ पूरे एप्लिकेशन में रहती है और हर जगह पठनीय होती है, इसलिए वैश्विक स्थिति के लिए एक साझा सेवा आमतौर पर एक सुरक्षित स्थान होता है। आधिकारिक $rootScope संदर्भ इसमें संपूर्ण एपीआई सूचीबद्ध है।

डेटा कहाँ मौजूद है, यह जानना काम का आधा हिस्सा है। दूसरा आधा हिस्सा यह सिखाना है कि उपयोगकर्ता द्वारा कुछ करने पर कैसे प्रतिक्रिया देनी है।

AngularJS में व्यवहार स्थापित करना या जोड़ना

घटनाओं पर प्रतिक्रिया करने या दृश्य में किसी प्रकार की गणना/प्रसंस्करण निष्पादित करने के लिए, हमें स्कोप को व्यवहार प्रदान करना होगा।

दृश्य द्वारा ट्रिगर किए जा सकने वाले विशिष्ट ईवेंट पर प्रतिक्रिया देने के लिए स्कोप ऑब्जेक्ट में व्यवहार जोड़े जाते हैं। एक बार नियंत्रक में व्यवहार परिभाषित हो जाने के बाद, इसे दृश्य द्वारा एक्सेस किया जा सकता है।

आइये एक उदाहरण देखें कि हम इसे कैसे प्राप्त कर सकते हैं।

व्यवहार सेट करना या जोड़ना

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta chrset="UTF 8">
    <title>Guru99</title>     
</head>  
<body ng-app="DemoApp">
<h1> Guru99 Global Event</h1>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<div ng-controller="DemoController">
	{{fullName("Guru","99")}}
</div>
<script type="text/javascript">  
	var app = angular.module("DemoApp", []);
	app.controller("DemoController", function($scope) {
    
    $scope.fullName=function(firstName,lastname){
		return firstName + lastname;
		}
	} );
</script> 

</body>  
</html>

Code स्पष्टीकरण:

  1. हम "fullName" नामक एक व्यवहार बना रहे हैं। यह व्यवहार एक फ़ंक्शन है जो 2 पैरामीटर (firstName,lastname) स्वीकार करता है।
  2. इसके बाद यह व्यवहार इन दो पैरामीटरों का संयोजन लौटाता है।
  3. व्यू में हम बिहेवियर को कॉल कर रहे हैं और उसमें “ के 2 मान पास कर रहे हैंGuru" और "99" जो व्यवहार में पैरामीटर के रूप में पास किए जाते हैं।

यदि कमांड सफलतापूर्वक निष्पादित हो जाता है, तो जब आप ब्राउज़र में अपना कोड चलाएंगे तो निम्नलिखित आउटपुट दिखाया जाएगा।

आउटपुट:

व्यवहार सेट करना या जोड़ना

ब्राउज़र में आपको दोनों मानों का संयोजन दिखाई देगा। Guru और 99 जो व्यवहार में पारित किए गए थे नियंत्रक.

ऊपर दिए गए उदाहरण की तरह बाइंडिंग अपने आप रीफ्रेश हो जाती हैं, और किसी एप्लिकेशन के बड़ा होने से पहले उस प्रक्रिया को समझना महत्वपूर्ण है जिसके कारण ऐसा होता है।

स्कोप वॉचर्स और डाइजेस्ट साइकिल क्यों महत्वपूर्ण हैं?

AngularJS, चेंज इवेंट्स के बजाय डर्टी चेकिंग के माध्यम से व्यू को स्कोप के साथ तालमेल में रखता है। तीन स्कोप API इस प्रक्रिया को संचालित करते हैं:

  • $watch: किसी एक्सप्रेशन के लिए एक लिसनर रजिस्टर करता है। इंटरपोलेशन जैसे {{fullName}} टेम्प्लेट लिंकिंग के दौरान आपके लिए वॉचर्स को रजिस्टर करें।
  • $आवेदन: यह AngularJS एक्ज़ीक्यूशन कॉन्टेक्स्ट में प्रवेश करता है, आपके कोड का मूल्यांकन करता है और फिर डाइजेस्ट को ट्रिगर करता है। इसकी आवश्यकता केवल कस्टम इवेंट कॉलबैक या थर्ड पार्टी लाइब्रेरी कॉलबैक के अंदर ही होती है, क्योंकि बिल्ट-इन डायरेक्टिव इसे पहले ही कॉल कर लेते हैं।
  • $डाइजेस्ट: यह $rootScope और उसके बच्चों पर मौजूद प्रत्येक वॉचर को देखता है, वर्तमान मान की तुलना पिछले मान से करता है, और तब तक दोहराता है जब तक कि मॉडल में परिवर्तन होना बंद न हो जाए।

क्योंकि डाइजेस्ट कई पास चला सकता है, इसलिए वॉच एक्सप्रेशन को कम खर्चीला रखना चाहिए। इनके अंदर DOM एक्सेस से बचें, क्योंकि DOM को पढ़ना किसी अन्य फ़ाइल को पढ़ने की तुलना में कई गुना धीमा होता है। Javaस्क्रिप्ट प्रॉपर्टी।

घड़ी की गहराई भी लागत को प्रभावित करती है। संदर्भ के आधार पर घड़ी देखना सबसे तेज़ तरीका है और इससे तभी पता चलता है जब पूरी कीमत बदल दी जाती है। $watchCollection यह किसी ऐरे या ऑब्जेक्ट के अंदर आइटम जोड़े जाने, हटाए जाने या पुनर्व्यवस्थित किए जाने पर ध्यान देता है। मान के आधार पर निगरानी करने से प्रत्येक डाइजेस्ट पर एक नेस्टेड संरचना को पार किया जाता है और यह सबसे खर्चीला विकल्प है, इसलिए इसे सबसे अंत में चुनें।

अक्सर पूछे जाने वाले प्रश्न

एक आइसोलेट स्कोप अपने पैरेंट से प्रोटोटाइपिक रूप से इनहेरिट नहीं करता है। .component() हेल्पर के साथ निर्मित कंपोनेंट डायरेक्टिव को हमेशा एक आइसोलेट स्कोप प्राप्त होता है, जो रियूजेबल विजेट्स को आसपास के कंट्रोलर से स्वतंत्र रखता है और पैरेंट प्रॉपर्टीज के आकस्मिक रीड को रोकता है।

$emit पैरेंट स्कोप्स के माध्यम से $rootScope की ओर एक स्कोप इवेंट भेजता है, जबकि $broadcast इसे प्रत्येक चाइल्ड स्कोप तक नीचे की ओर भेजता है। दोनों को $on के साथ प्राप्त किया जाता है। $broadcast का उपयोग सोच-समझकर करें, क्योंकि यह प्रत्येक डिसेंडेंट स्कोप पर जाता है।

जब किसी चाइल्ड स्कोप की आवश्यकता न रह जाए, तो scope.$destroy() फ़ंक्शन को कॉल करें। इससे स्कोप में डाइजेस्ट का प्रसार रुक जाता है और गार्बेज कलेक्टर अपने मॉडल्स को पुनः प्राप्त कर लेता है। $watch द्वारा लौटाए गए फ़ंक्शन को कॉल करके मैन्युअल वॉचर्स को भी डीरजिस्टर करें।

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

एआई सहायक $scope प्रॉपर्टीज़ को कंपोनेंट क्लास फ़ील्ड पर मैप करते हैं और $watch लॉजिक को सिग्नल या RxJS स्ट्रीम के रूप में पुनः लिखते हैं। इन्हें आधिकारिक संस्करण के साथ उपयोग करें। कोणीय प्रलेखन तैयार करें और यूनिट परीक्षण चलाएं, क्योंकि उत्पन्न रूपांतरणों में अक्सर विरासत में मिले स्कोप लुकअप छूट जाते हैं।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: