AngularJS में “ng-model” का उपयोग उदाहरणों के साथ कैसे करें
⚡ स्मार्ट सारांश
AngularJS में ng-model एक इनपुट कंट्रोल को सीधे $scope पर मौजूद प्रॉपर्टी से जोड़ता है।ping व्यू और मॉडल दोनों दिशाओं में सिंक्रनाइज़ किए गए हैं। नीचे दिए गए अनुभागों में एट्रिब्यूट, तीन कार्यशील उदाहरण और शुरुआती लोगों द्वारा सबसे अधिक की जाने वाली त्रुटियों को शामिल किया गया है।

AngularJS में एनजी-मॉडल क्या है?
AngularJS में ng-model एक डायरेक्टिव है जो मॉडल को रिप्रेजेंट करता है, और इसका मुख्य उद्देश्य "व्यू" को "मॉडल" से जोड़ना है। उपयोगकर्ता किसी कंट्रोल में जो कुछ भी टाइप करता है, वह सीधे ng-model पर मौजूद प्रॉपर्टी में लिख दिया जाता है। $scopeऔर कंट्रोलर उस प्रॉपर्टी में जो कुछ भी लिखता है, वह सीधे कंट्रोल में वापस भेज दिया जाता है।
उदाहरण के लिए, मान लीजिए कि आप अंतिम उपयोगकर्ता को नीचे दिखाए गए जैसा एक सरल पृष्ठ दिखाना चाहते हैं, जिसमें उपयोगकर्ता से टेक्स्टबॉक्स में "पहला नाम" और "अंतिम नाम" दर्ज करने के लिए कहा जाता है। और फिर आप यह सुनिश्चित करना चाहते हैं कि उपयोगकर्ता द्वारा दर्ज की गई जानकारी आपके डेटा मॉडल में संग्रहीत हो जाए।
आप ng-model डायरेक्टिव का उपयोग करके "प्रथम नाम" और "अंतिम नाम" टेक्स्ट बॉक्स फ़ील्ड को अपने डेटा मॉडल से मैप कर सकते हैं। यह डायरेक्टिव यह सुनिश्चित करेगा कि "व्यू" और आपके "मॉडल" का डेटा बिना किसी इवेंट-हैंडलिंग कोड के हर समय सिंक्रनाइज़ रहे।
⚠️ संस्करण संबंधी टिप्पणी: AngularJS (1.x शाखा) का सपोर्ट 31 दिसंबर 2021 को समाप्त हो गया और अब इसे सुरक्षा पैच नहीं मिलते हैं। नीचे दिए गए उदाहरण अभी भी चलते हैं, लेकिन आधुनिक Angular में वही दो-तरफ़ा बाइंडिंग इस प्रकार लिखी जाती है। [(ngModel)] और इसके लिए FormsModule की आवश्यकता होती है।
एनजी-मॉडल विशेषता
जैसा कि ऊपर के अनुभाग में चर्चा की गई है, ng-model विशेषता का उपयोग आपके मॉडल में मौजूद डेटा को उपयोगकर्ता को प्रस्तुत किए जाने वाले दृश्य से जोड़ने के लिए किया जाता है।
एनजी-मॉडल विशेषता का उपयोग निम्न के लिए किया जाता है,
- व्यू में इनपुट, टेक्स्ट एरिया और सेलेक्ट एलिमेंट जैसे कंट्रोल्स को मॉडल में बाइंड करना।
- सत्यापन व्यवहार प्रदान करना — उदाहरण के लिए, एक टेक्स्ट बॉक्स में सत्यापन जोड़ा जा सकता है ताकि केवल संख्यात्मक वर्ण ही दर्ज किए जा सकें।
- नियंत्रण की स्थिति को बनाए रखना। स्थिति से हमारा तात्पर्य यह है कि नियंत्रण और डेटा हमेशा सिंक्रनाइज़ रहें: यदि डेटा का मान बदलता है, तो नियंत्रण का मान स्वचालित रूप से बदल जाता है, और इसके विपरीत भी।
- उस स्थिति को CSS क्लास के रूप में प्रदर्शित करना। AngularJS जोड़ता है
ng-pristine,ng-dirty,ng-validऔरng-invalidप्रत्येक कंट्रोल में एक ng-model होता है, जिससे फॉर्म की कंडीशनल स्टाइलिंग सरल हो जाती है।
एक बार विशेषता समझ में आ जाने के बाद, अगला चरण इसे उन तीन प्रकार के नियंत्रणों पर लागू करना है जिनसे आपका सामना सबसे अधिक बार होगा।
एनजी-मॉडल का उपयोग कैसे करें
1) पाठ क्षेत्र
टेक्स्ट एरिया टैग का उपयोग मल्टी-लाइन टेक्स्ट इनपुट नियंत्रण को परिभाषित करने के लिए किया जाता है। टेक्स्ट एरिया में असीमित संख्या में अक्षर हो सकते हैं, और टेक्स्ट एक निश्चित-चौड़ाई वाले फ़ॉन्ट में रेंडर होता है।
अब आइए एक सरल उदाहरण देखें कि हम टेक्स्ट एरिया कंट्रोल में ng-model डायरेक्टिव कैसे जोड़ सकते हैं। इस उदाहरण में, हम यह दिखाना चाहते हैं कि हम कंट्रोलर से व्यू में एक मल्टीलाइन स्ट्रिंग कैसे पास कर सकते हैं और उस मान को टेक्स्ट एरिया कंट्रोल से कैसे जोड़ सकते हैं।
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> <script src="https://code.angularjs.org/1.8.3/angular.js"></script> </head> <body> <h1>Guru99 Global Event</h1> <div ng-app="DemoApp" ng-controller="DemoCtrl"> <form> Topic Description:<br><br> <textarea rows="4" cols="50" ng-model="pDescription"></textarea> </form> </div> <script> var app = angular.module('DemoApp', []); app.controller('DemoCtrl', function($scope) { $scope.pDescription = "This topic looks at how Angular JS works \nModels in Angular JS"; }); </script> </body> </html>
Code स्पष्टीकरण:
- RSI एनजी-मॉडल निर्देश यह "p" नामक सदस्य चर को संलग्न करता हैDescript“आयन” को “टेक्स्टएरिया” नियंत्रण में जोड़ें। “पी”Descript"ion" वेरिएबल में वह टेक्स्ट होता है जो टेक्स्ट एरिया कंट्रोल को पास किया जाता है।
rows="4"औरcols="50"एट्रिब्यूट्स केवल कंट्रोल का आकार निर्धारित करते हैं ताकि मल्टी-लाइन टेक्स्ट सही ढंग से प्रदर्शित हो सके। - सदस्य चर “pDescript"आयन" को एक बहु-पंक्ति मान सौंपा गया है।
\nस्ट्रिंग के अंदर मौजूद एस्केप सीक्वेंस ही वह चीज है जो टेक्स्ट एरिया द्वारा रेंडर किए जाने पर टेक्स्ट को दूसरी लाइन पर जाने के लिए मजबूर करती है।
आउटपुट:
आउटपुट से यह स्पष्ट है कि कंट्रोलर में असाइन किया गया मल्टीलाइन टेक्स्ट टेक्स्ट एरिया कंट्रोल में प्रदर्शित होता है, जो ठीक उसी स्थान पर दो पंक्तियों में विभाजित होता है जहां \n बैठता है।
2) इनपुट तत्व
ng-model डायरेक्टिव सामान्य इनपुट एलिमेंट्स के साथ भी काम करता है। नीचे हम एक टेक्स्ट बॉक्स और दो चेकबॉक्स को एक साथ बाइंड करते हैं, ताकि आप देख सकें कि ng-model स्ट्रिंग वैल्यू और बूलियन वैल्यू को एक साथ कैसे हैंडल करता है।
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> <script src="https://code.angularjs.org/1.8.3/angular.js"></script> </head> <body> <h1>Guru99 Global Event</h1> <div ng-app="DemoApp" ng-controller="DemoCtrl"> <form> Topic Description:<br><br> Name : <input type="text" ng-model="pname"><br> Topic :<br> <input type="checkbox" ng-model="Topic.Controller">Controller<br> <input type="checkbox" ng-model="Topic.Models">Models </form> </div> <script> var app = angular.module('DemoApp', []); app.controller('DemoCtrl', function($scope) { $scope.pname = "Guru99"; $scope.Topic = { Controller: true, Models: false }; }); </script> </body> </html>
Code स्पष्टीकरण:
- ng-model निर्देश टेक्स्ट इनपुट कंट्रोल से सदस्य चर "pname" को जोड़ता है, और गुणधर्मों को भी जोड़ता है।
Topic.ControllerऔरTopic.Modelsदो चेकबॉक्स नियंत्रणों के लिए। - कंट्रोलर में, “pname” को स्ट्रिंग “ दी गई हैGuru99”, और “Topic” ऑब्जेक्ट को दो बूलियन सदस्य दिए गए हैं। ng-model से बंधा हुआ चेकबॉक्स हमेशा एक बूलियन पढ़ता और लिखता है, यही कारण है
trueबॉक्स को चेक के रूप में दिखाता है औरfalseइसे स्पष्ट कर देता है।
आउटपुट:
आउटपुट से,
- यह स्पष्ट रूप से देखा जा सकता है कि को दिया गया मान
pnameचर है “Guru99 "। - चूंकि पहला बाउंड मान है
true, "कंट्रोलर" चेकबॉक्स के लिए चेकबॉक्स चिह्नित है। इसी तरह, चूंकि दूसरा मान हैfalse“मॉडल” चेकबॉक्स के लिए चेकबॉक्स चिह्नित नहीं है।
3) ड्रॉपडाउन से तत्व का चयन करें
ng-model निर्देश को सेलेक्ट एलिमेंट पर भी लागू किया जा सकता है, ताकि उपयोगकर्ता द्वारा चुना गया आइटम मॉडल में संग्रहीत हो जाए।
यहां हमारे पास एक टेक्स्ट इनपुट होगा जिसमें नाम “ होगाGuru99”, और दो सूची आइटमों वाली एक चयन सूची, “कंट्रोलर” और “मॉडल”।
⚠️ सुधार: ऊपर दिए गए स्क्रीनशॉट में मूल लिस्टिंग दिखाई गई है, जिसमें सेलेक्ट एलिमेंट को उसी से जोड़ा गया है। Topics वह ऑब्जेक्ट जो विकल्प का टेक्स्ट प्रदान करता है। जैसे ही कोई उपयोगकर्ता विकल्प चुनता है, AngularJS उसे ओवरराइट कर देता है। Topics चयनित स्ट्रिंग के साथ दोनों विकल्प गायब हो जाते हैं। नीचे दी गई संशोधित सूची में सूची को एक प्रॉपर्टी में और चयन को दूसरी प्रॉपर्टी में रखा गया है, और इसका उपयोग किया गया है। ng-options सूची बनाने के लिए।
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Event Registration</title> <script src="https://code.angularjs.org/1.8.3/angular.js"></script> </head> <body> <h1>Guru99 Global Event</h1> <div ng-app="DemoApp" ng-controller="DemoCtrl"> <form> Topic Description:<br><br> Name : <input type="text" ng-model="pName"><br> Topic :<br> <!-- Topics holds the list; selectedTopic holds the choice --> <select ng-model="selectedTopic" ng-options="t for t in Topics"></select> </form> </div> <script> var app = angular.module('DemoApp', []); app.controller('DemoCtrl', function($scope) { $scope.pName = "Guru99"; $scope.Topics = ["Controller", "Models"]; $scope.selectedTopic = $scope.Topics[0]; }); </script> </body> </html>
Code स्पष्टीकरण:
- टेक्स्ट इनपुट इससे जुड़ा हुआ है
pNameऔर चयनित तत्व इससे बंधा हुआ हैselectedTopicक्योंकि सेलेक्ट में अपनी खुद की मॉडल प्रॉपर्टी होती है, इसलिए किसी विकल्प को चुनने से सूची में कोई बदलाव नहीं होता है। - RSI
Topicsऐरे में "कंट्रोलर" और "मॉडल" नामक दो मान होते हैं।ng-optionsएक्सप्रेशन उस ऐरे को स्कैन करता है और प्रत्येक एंट्री के लिए एक विकल्प प्रस्तुत करता है, इसलिए तीसरा विषय जोड़ने के लिए मार्कअप में किसी बदलाव की आवश्यकता नहीं होती है। selectedTopicयह पहले से ही पहली प्रविष्टि पर सेट होता है, जिसके कारण ड्रॉपडाउन एक खाली पंक्ति के बजाय एक उपयुक्त डिफ़ॉल्ट मान के साथ खुलता है।
आउटपुट:
आउटपुट से यह देखा जा सकता है कि असाइन किया गया मान pName चर है “Guru99”, और सेलेक्ट कंट्रोल “कंट्रोलर” और “मॉडल्स” के विकल्प प्रदान करता है। कार्यशील उदाहरणों के अलावा, बाइंडिंग कभी-कभी अपडेट होने से इनकार कर देती हैं, और इसके कारणों को जानना महत्वपूर्ण है।
ng-model बाइंडिंग कभी-कभी विफल क्यों हो जाती हैं?
रिपोर्ट की गई अधिकांश ng-model समस्याएं AngularJS में बग नहीं हैं, बल्कि स्कोप और प्रिमिटिव के काम करने के तरीके के परिणाम हैं।
इसका सबसे आम उदाहरण एक डायरेक्टिव के अंदर रखा गया बाइंडिंग है जो एक चाइल्ड स्कोप बनाता है, जैसे कि एनजी-दोहरानेng-if या ng-switch. लेखन ng-model="name" इससे चाइल्ड स्कोप पर एक शैडो कॉपी बन जाती है, इसलिए पैरेंट कभी भी एडिट को नहीं देख पाता। इसके बजाय किसी ऑब्जेक्ट की प्रॉपर्टी से बाइंडिंग करना बेहतर है। ng-model="user.name" — यह हर स्कोप को एक ही संदर्भ की ओर इंगित करता है। यही कारण है कि अनुभवी AngularJS डेवलपर हर ng-model एक्सप्रेशन में डॉट लगाने पर जोर देते हैं।
बाकी बचे मामलों के लिए दो और कारण जिम्मेदार हैं:
- नियंत्रक या मॉड्यूल अनुपलब्ध है: यदि ng-app या ng-controller की वर्तनी गलत है, तो बाइंडिंग त्रुटि उत्पन्न करने के बजाय चुपचाप कुछ भी रेंडर नहीं करती है।
- AngularJS के बाहर मान में परिवर्तन हुआ: jQuery हैंडलर या setTimeout कॉलबैक से सेट किया गया मान डाइजेस्ट चक्र के बाहर आता है, इसलिए व्यू तब तक रीफ्रेश नहीं होता जब तक कि
$scope.$apply()रन।
इन तीन चीजों की जांच करने से उन अधिकांश समस्याओं का समाधान हो जाता है जो काम नहीं कर रही होती हैं।







