एनजी-परिवर्तन को नया मूल्य और मूल मूल्य मिलता है


118

मैं पुलडाउन से मानों का चयन करने के लिए एनजी-विकल्पों का उपयोग कर रहा हूं। मैं पुराने मूल्य की नए मूल्य से तुलना करने में सक्षम होना चाहता हूं। एनजी-परिवर्तन पुल डाउन के नए मूल्य को हथियाने के लिए अच्छी तरह से काम करता है, लेकिन मैं नए मूल्य और मूल मूल्य दोनों कैसे प्राप्त कर सकता हूं?

<select ng-change="updateValue(user)" ng-model="user.id" ng-options="user.id as user.name for user in users"></select> 

उदाहरण के लिए, मान लें कि मैं नियंत्रक को लॉग इन करना चाहता था, "आपका पूर्व user.name बिल था, आपका वर्तमान उपयोगकर्ता नाम PhilippL है।"


1
मेरे जवाब की जाँच करें यहाँ stackoverflow.com/questions/21909163/… डुप्लिकेट हो सकता है
bresleveloper

यह सुनिश्चित नहीं है कि यह प्रशासनिक रूप से कैसे काम करता है लेकिन किसी भी तरह डुप्लिकेट के जवाब को इस एक के साथ विलय किया जाना चाहिए। bresleveloper एक अच्छा समाधान है (डुप्लिकेट से) लेकिन TGH उत्तर को भी दिखाया जाना चाहिए। पहला फ्रेमवर्क के कामकाज पर निर्भर करता है, जो भविष्य में बदल सकता है, जबकि दूसरा फ्रेमवर्क एग्नोस्टिक है।
user1821052

जवाबों:


279

एक कोणीय {{अभिव्यक्ति}} के साथ, आप पुराने उपयोगकर्ता या उपयोगकर्ता को जोड़ सकते हैं। एनजी-परिवर्तन विशेषता के लिए एक शाब्दिक स्ट्रिंग के रूप में मान।

<select ng-change="updateValue(user, '{{user.id}}')" 
        ng-model="user.id" ng-options="user.id as user.name for user in users">
</select>

एनजीचेंज पर, अपडेट करने के लिए पहला तर्कवैल्यू नया उपयोगकर्ता मूल्य होगा, दूसरा तर्क वह शाब्दिक होगा जो पुराने उपयोगकर्ता के साथ कोणीय द्वारा चयन-टैग को अंतिम रूप से अद्यतन किए जाने पर बनाया गया था।


6
ध्यान दें कि userमेथड कॉल एक से है ng-model, न कि एनजी-ऑप्शंस से (भ्रामक हो सकता है)। उम्मीद है कि यह सुरुचिपूर्ण समाधान कोणीय के भविष्य के संस्करणों में भी काम करेगा :)
icl7126

15
इसे हानिकारक माना जाना चाहिए। मैं सिर्फ एक गंदे बग भर में आया था जब user.id में एक विशेष वर्ण होता है (जैसे 'या /).This क्योंकि कोणीय अभिव्यक्ति पार्सर को अपडेटवैल्यू (उपयोगकर्ता,' ब्लाह / ब्लाह ') जैसी अभिव्यक्ति पसंद नहीं है।
एंटोनी बैक्टेल-शेवरेल

2
फ़ंक्शन अपडेटवैल्यू में, $ गुंजाइश.user.id में पहले से ही नया चयनित मूल्य है - इसके लिए नए मान के लिए एक पैरामीटर पास करने की आवश्यकता नहीं है
माजिक्स

@ LINQ2Vodka, मुझे लगता है कि यह केवल उद्धरण चिह्नों के बिना काम करता है अगर user.idसंख्यात्मक है ... यह user.idएक स्ट्रिंग या एक गाइड
तामस

1
beautiful :))))
मकतून

16

इसके अलावा आप उपयोग कर सकते हैं

<select ng-change="updateValue(user, oldValue)"     
       ng-init="oldValue=0"
       ng-focus="oldValue=user.id"
       ng-model="user.id" ng-options="user.id as user.name for user in users">
</select>

1
यह जवाब एनजी-रिपीट का वास्तव में अच्छा काम करता है। आप इसके बजाय एनजी-क्लिक का उपयोग कर सकते हैं यदि आप जिस तत्व का उपयोग कर रहे हैं वह एनजी-परिवर्तन का समर्थन करता है लेकिन एनजी-फोकस नहीं।
मेटिकियोस

1
ng-init = "oldValue = 0" और ng-focus = "oldValue = user.id" ने मेरे साथ छल किया।
thatzprem

14

आप एनजी-परिवर्तन = someMethod ({{user.id}}) जैसे कुछ का उपयोग कर सकते हैं। अपने मूल्य को {{व्यंजक}} में रखकर, यह अभिव्यक्ति का इन-लाइन मूल्यांकन करेगा और आपको वर्तमान मूल्य देगा (एनजी-परिवर्तन विधि से पहले मूल्य को कहा जाता है)।

<select ng-model="selectedValue" ng-change="change(selectedValue, '{{selectedValue}}')">

13

बस अपने कंट्रोलर में करंटवैल्यू वैरिएबल रखें जिसे आप हर बदलाव पर अपडेट करते हैं। आप इसे अपडेट करने से पहले हर बार नए मूल्य से तुलना कर सकते हैं। '

एक घड़ी का उपयोग करने का विचार अच्छा है, लेकिन मुझे लगता है कि एक सरल चर सबसे सरल और सबसे तार्किक समाधान है।


वॉच थोड़ा महंगा ऑपरेशन है, मुझे db-inf का उत्तर पसंद आया .. यह सरल काम करने वाला उपाय है
प्रमोद शर्मा

4
सबसे बढ़िया उत्तर। यदि आप एनजी-रिपीट के अंदर हैं, तो एनजी-इनिट का उपयोग करके उप-स्कोप में एक वैरिएबल बनाएं।
रोमेन एफ।

1
IMHO यह सबसे अच्छा विकल्प है। चूंकि पुराने मान पुनर्प्राप्त नहीं किए जा रहे हैं, इसलिए वे आउट-ऑफ-द-बॉक्स द्वारा ngChange द्वारा प्रदान नहीं किए जाते हैं, @ db-inf जैसे समाधान भविष्य के संस्करणों पर निहित हो सकते हैं। इसके अलावा, यह एक नियंत्रक की जिम्मेदारी की तरह लगता है, इसे दृश्य परत को सौंपने के लिए अजीब लगता है।
फेलिप लेओ

9

आप एक गुंजाइश घड़ी का उपयोग कर सकते हैं:

$scope.$watch('user', function(newValue, oldValue) {
  // access new and old value here
  console.log("Your former user.name was "+oldValue.name+", you're current user name is "+newValue.name+".");
});

https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watch


6
मैं एक लेख में आया हूं जिसमें कहा गया है कि एनजी-परिवर्तन की तुलना में घड़ी बहुत अधिक गंदी / अक्षम है। benlesh.com/2013/10/title.html
मेनियोस

5
मेरे अनुभव में आप लगभग कभी नहीं देखना चाहते हैं
nardnob

2
यदि प्रोग्रामिंग एक व्यक्तिपरक कला थी, तो आपके पास वहां कुछ हो सकता है। काश - कई कारण हैं कि आप एनजी-चार्ज या अन्य निर्देश आधारित दृष्टिकोणों से बचना चाहते हैं, चीजों को "कोणीय" तरीके से करने के लिए असंबंधित।
tommybananas

2

आप इसके बजाय एक घड़ी का उपयोग कर सकते हैं, क्योंकि इसका पुराना और नया मूल्य है, लेकिन फिर आप पाचन चक्र में जोड़ रहे हैं।

मैं सिर्फ कंट्रोलर में दूसरा वेरिएबल रखूँगा और सेट करूँगा।


यह एक बहुत ही तुच्छ उदाहरण है, मैं इस उदाहरण में एक अकेले द्रष्टा के बारे में चिंता करने पर पठनीयता प्राप्त करूँगा। फिर भी मुझे लगता है कि थके हुए होने के लिए एक अच्छी बात है।
1

1
वॉच और एनजी-परिवर्तन में वास्तव में अलग-अलग व्यवहार होते हैं: एनजी-परिवर्तन केवल उपयोगकर्ता घटनाओं का पता लगाता है, जबकि $watchहर बार परिवर्तन होने पर परिवर्तन होगा। वॉचर्स जटिलता बढ़ाते हैं और जब कोड अपने मूल्यों को बदलते हैं तो अपडेट साइकिल बनाने के लिए प्रवण होते हैं।
Rhys van der Waerden

मैं @Rhys van der Waerden से सहमत हूं ... इस लेख में कहा गया है कि $ घड़ी थोड़ी खतरनाक है: benlesh.com/2013/10/title.html
Menios
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.