कई $ गुंजाइश विशेषताएँ देखें


442

क्या कई वस्तुओं का उपयोग करके घटनाओं की सदस्यता लेने का एक तरीका है $watch

उदाहरण के लिए

$scope.$watch('item1, item2', function () { });

जवाबों:


586

AngularJS 1.3 से शुरू होकर एक नया तरीका है जिसे $watchGroupअभिव्यक्तियों के सेट को देखने के लिए कहा जाता है ।

$scope.foo = 'foo';
$scope.bar = 'bar';

$scope.$watchGroup(['foo', 'bar'], function(newValues, oldValues, scope) {
  // newValues array contains the current values of the watch expressions
  // with the indexes matching those of the watchExpression array
  // i.e.
  // newValues[0] -> $scope.foo 
  // and 
  // newValues[1] -> $scope.bar 
});

7
$ watchCollection ('[a, b]') के खिलाफ क्या अंतर है ??
कामिल तोमिक्क

28
अंतर यह है कि आप एक स्ट्रिंग के बजाय एक उचित सरणी का उपयोग कर सकते हैं जो एक सरणी की तरह दिखता है
पाओलो मोरेटी

2
मुझे एक समान समस्या थी लेकिन कंट्रोलर पैटर्न का उपयोग करना। मेरे मामले में तयकर्ता के नाम से चरों को जोड़ने के लिए तय किया गया था:$scope.$watchGroup(['mycustomctrl.foo', 'mycustomctrl.bar'],...
morels

1
यह मेरे लिए कोणीय 1.6 पर काम नहीं करता है। अगर मैं समारोह पर एक कंसोल लॉग शब्दों में कहें, मुझे लगता है कि यह सिर्फ एक बार के साथ चलाता है देख सकते हैं newValuesऔर oldValuesके रूप में undefinedकरते हुए अलग-अलग गुण सामान्य रूप से काम देख रहा है,।
अलेजांद्रो गार्सिया इग्लेसियस

290

AngularJS 1.1.4 के साथ शुरुआत आप उपयोग कर सकते हैं $watchCollection:

$scope.$watchCollection('[item1, item2]', function(newValues, oldValues){
    // do stuff here
    // newValues and oldValues contain the new and respectively old value
    // of the observed collection array
});

प्लंकर यहां उदाहरण दें

यहाँ प्रलेखन


109
ध्यान दें कि पहला पैरामीटर एक सरणी नहीं है । यह एक स्ट्रिंग है जो एक सरणी की तरह दिखता है।
एमके सफी

1
इसके लिए धन्यवाद। अगर यह मेरे लिए काम करता है, तो मैं आपको एक हजार सोने के सिक्के दे दूंगा - आभासी वाले, निश्चित रूप से :)
आदित्य सक्सेना

5
स्पष्ट होने के लिए (मुझे महसूस करने में कुछ मिनट लगते हैं) $watchCollectionका उद्देश्य एक वस्तु को सौंपना है और किसी भी वस्तु के गुणों में बदलाव के लिए एक घड़ी प्रदान $watchGroupकरना है , जबकि इरादा है कि परिवर्तनों के लिए देखने के लिए व्यक्तिगत गुणों की एक सरणी सौंपी जाए। इसी तरह की अलग-अलग समस्याओं से निपटने के लिए थोड़ा अलग है। ओह!
Mattygabe

1
जब आप इस विधि का उपयोग करते हैं तो किसी तरह, newValues ​​और oldValues ​​हमेशा बराबर होते हैं: plnkr.co/edit/SwwdpQcNf78pQ80hhXMr
9

धन्यवाद। इसने मेरी समस्या हल कर दी। क्या $ घड़ी का उपयोग करने का कोई प्रदर्शन हिट / मुद्दा है?
सैयद नासिर अब्बास

118

$watch पहला पैरामीटर एक फ़ंक्शन भी हो सकता है।

$scope.$watch(function watchBothItems() {
  return itemsCombinedValue();
}, function whenItemsChange() {
  //stuff
});

यदि आपके दो संयुक्त मूल्य सरल हैं, तो पहला पैरामीटर सामान्य रूप से एक कोणीय अभिव्यक्ति है। उदाहरण के लिए, पहला नाम और अंतिम नाम:

$scope.$watch('firstName + lastName', function() {
  //stuff
});

8
यह एक ऐसे उपयोग-केस की तरह लगता है जो डिफ़ॉल्ट रूप से फ्रेमवर्क में शामिल करने के लिए रो रहा है। यहां तक ​​कि एक गणना की गई संपत्ति भी सरल है क्योंकि fullName = firstName + " " + lastNameपहले तर्क (जैसे सरल अभिव्यक्ति 'firstName, lastName') के बजाय एक फ़ंक्शन पास करना आवश्यक है । कोणीय एसओ शक्तिशाली है, लेकिन कुछ ऐसे क्षेत्र हैं जहां यह उन तरीकों से बहुत अधिक डेवलपर के अनुकूल हो सकता है जो प्रदर्शन या डिजाइन सिद्धांतों से समझौता नहीं करते (प्रतीत होते हैं)।
एक्सएमएल

4
अच्छी तरह से $ घड़ी सिर्फ एक कोणीय अभिव्यक्ति लेती है, जिसका मूल्यांकन उस गुंजाइश पर किया जाता है जिस पर इसे बुलाया जाता है। तो आप कर सकते हैं $scope.$watch('firstName + lastName', function() {...})। तुम भी सिर्फ दो घड़ियों कर सकता है function nameChanged() {}; $scope.$watch('firstName', nameChanged); $scope.$watch('lastName', nameChanged);:। मैंने जवाब के लिए साधारण मामला जोड़ा।
एंड्रयू जोसलिन

'फर्स्ट नेम + लास्ट नेम' में प्लस स्ट्रेंथ कॉनटेनैशन है। तो कोणीय सिर्फ जाँच करता है कि क्या संघनन का परिणाम अब अलग है।
mb21

16
स्ट्रिंग संघनन के लिए थोड़ी देखभाल की आवश्यकता होती है - यदि आप "पैरा नॉर्मन" को "पैरा नॉर्मान" में बदल देते हैं, तो आप एक प्रतिक्रिया को ट्रिगर नहीं करेंगे; पहले और दूसरे कार्यकाल के बीच "\ t | \ t" जैसे डिवाइडर लगाने के लिए सबसे अच्छा है, या सिर्फ JSON से चिपके रहें जो निश्चित है
डेव एडेलहर्ट

हालांकि एम्बरज बेकार है, लेकिन इसमें यह सुविधा है! कि कोणीय लोग सुनें। मुझे लगता है कि घड़ियों को करना सबसे तर्कसंगत तरीका है।
अलादीन ममेड़

70

यहां आपके मूल छद्म कोड के समान समाधान है जो वास्तव में काम करता है:

$scope.$watch('[item1, item2] | json', function () { });

संपादित करें: ठीक है, मुझे लगता है कि यह और भी बेहतर है:

$scope.$watch('[item1, item2]', function () { }, true);

मूल रूप से हम जोंस स्टेप को छोड़ रहे हैं, जो कि शुरुआत के साथ गूंगा लग रहा था, लेकिन यह इसके बिना काम नहीं कर रहा था। वे कुंजी प्रायः छोड़े गए 3 पैरामीटर हैं जो संदर्भ समानता के विपरीत ऑब्जेक्ट समानता को चालू करता है। तब हमारे बनाए सरणी वस्तुओं के बीच तुलना वास्तव में सही काम करती है।


मेरा भी ऐसा ही सवाल था। और यह मेरे लिए सही उत्तर है।
केल्विन चेंग

यदि सरणी अभिव्यक्ति में आइटम सरल प्रकार नहीं हैं, तो दोनों में एक मामूली प्रदर्शन होता है।
null

यह सच है .. यह घटक वस्तुओं की पूरी गहराई से तुलना कर रहा है। जो आप चाहते हैं या नहीं हो सकता है। आधुनिक कोणीय का उपयोग करते हुए एक संस्करण के लिए वर्तमान में स्वीकृत उत्तर देखें जो पूर्ण गहराई की तुलना नहीं करता है।
करेन ज़िल्स

किसी कारण से, जब मैं एक सरणी पर $ watchCollection का उपयोग करने की कोशिश कर रहा था, तो मुझे यह त्रुटि मिली TypeError: Object #<Object> has no method '$watchCollection'लेकिन यह समाधान मुझे मेरी समस्या को हल करने में मदद करता है!
abnotei

शांत, आप वस्तुओं के भीतर मूल्यों को भी देख सकते हैं:$scope.$watch('[chaptercontent.Id, anchorid]', function (newValues, oldValues) { ... }, true);
सर्ज वैन डेन ऑवर

15

आप कार्यक्षेत्र में किसी ऑब्जेक्ट के क्षेत्रों का चयन करने के लिए $ watchGroup में कार्यों का उपयोग कर सकते हैं।

        $scope.$watchGroup(
        [function () { return _this.$scope.ViewModel.Monitor1Scale; },   
         function () { return _this.$scope.ViewModel.Monitor2Scale; }],  
         function (newVal, oldVal, scope) 
         {
             if (newVal != oldVal) {
                 _this.updateMonitorScales();
             }
         });

1
आप क्यों इस्तेमाल करते हैं _this? क्या इसे स्पष्ट रूप से परिभाषित किए बिना कार्यों में गुंजाइश नहीं है?
sg.cc

1
मैं टाइपस्क्रिप्ट का उपयोग करता हूं, प्रस्तुत कोड परिणाम संकलित है।
यांग झांग

12

क्यों नहीं बस एक में लपेट forEach?

angular.forEach(['a', 'b', 'c'], function (key) {
  scope.$watch(key, function (v) {
    changed();
  });
});

यह संयुक्त मूल्य के लिए एक फ़ंक्शन प्रदान करने के रूप में एक ही ओवरहेड के बारे में है, वास्तव में मूल्य संरचना के बारे में चिंता किए बिना


इस मामले में लॉग () को कई बार निष्पादित किया जाएगा, है ना? मुझे लगता है कि नेस्टेड $ वॉच फ़ंक्शंस के मामले में ऐसा नहीं होगा। और यह एक बार में कई विशेषताओं को देखने के लिए समाधान में नहीं होना चाहिए।
जॉन डो

नहीं, लॉग केवल देखे गए प्रॉपर्टी के प्रति परिवर्तन के बाद निष्पादित किया जाता है। इसे कई बार क्यों लागू किया जाएगा?
एरिक एग्नर

ठीक है, मेरा मतलब है कि यह अच्छा नहीं होगा अगर हम उन सभी को एक साथ देखना चाहते हैं।
जॉन डो

1
जरूर, क्यों नहीं? मैं इसे एक परियोजना में इस तरह से करता हूं। changed()जब भी कुछ गुणों में से कुछ में परिवर्तन किया जाता है। यह ठीक वैसा ही व्यवहार है जैसे कि संयुक्त मूल्य के लिए एक फ़ंक्शन प्रदान किया गया था।
एरिक एगर

1
यह उस में थोड़ा अलग है अगर एक ही समय में सरणी में कई आइटम बदल जाते हैं तो $ घड़ी केवल एक बार बदले जाने वाले आइटम के बदले हैंडलर को आग लगा देगी।
बिंगल्स

11

मानों को संयोजित करने के लिए थोड़ा सा सुरक्षित समाधान आपके $watchफ़ंक्शन के रूप में निम्नलिखित का उपयोग कर सकता है :

function() { return angular.toJson([item1, item2]) }

या

$scope.$watch(
  function() {
    return angular.toJson([item1, item2]);
  },
  function() {
    // Stuff to do after either value changes
  });

5

$ घड़ी पहला पैरामीटर कोणीय अभिव्यक्ति या फ़ंक्शन हो सकता है। $ गुंजाइश पर प्रलेखन देखें । $ घड़ी । इसमें बहुत सी उपयोगी जानकारी है कि $ घड़ी विधि कैसे काम करती है: जब watchExpression कहा जाता है, तो कोणीय परिणामों की तुलना कैसे करता है, आदि।


4

कैसा रहेगा:

scope.$watch(function() { 
   return { 
      a: thing-one, 
      b: thing-two, 
      c: red-fish, 
      d: blue-fish 
   }; 
}, listener...);

2
तीसरे trueपैरामीटर के बिना scope.$watch(आपके उदाहरण के अनुसार), listener()हर एक बार आग लगाएगा, क्योंकि हर बार अनाम हैश का एक अलग संदर्भ होता है।
पीटर वी। मॉर्क

मैंने पाया कि इस समाधान ने मेरी स्थिति के लिए काम किया। मेरे लिए, यह अधिक पसंद था return { a: functionA(), b: functionB(), ... }:। मैं तब एक दूसरे के खिलाफ नए और पुराने मूल्यों की लौटी हुई वस्तुओं की जांच करता हूं।
रेवणोह

4
$scope.$watch('age + name', function () {
  //called when name or age changed
});

यहां फ़ंक्शन को तब बुलाया जाएगा जब उम्र और नाम का मूल्य दोनों बदल जाएंगे।


2
इस मामले में भी सुनिश्चित करें कि newValue और oldValue के तर्कों का उपयोग न करें, जो कोणीय कॉलबैक में गुजरते हैं, क्योंकि वे परिणामस्वरूप परिणामी होंगे और न केवल उस क्षेत्र को बदल दिया गया था
आकाश शिंदे

1

कोणीय $watchGroup1.3 संस्करण में पेश किया गया है, जिसके उपयोग से हम कई चर देख सकते हैं, एक एकल $watchGroupखंड $watchGroupपहले पैरामीटर के रूप में सरणी लेता है जिसमें हम अपने सभी चर को देखने के लिए शामिल कर सकते हैं।

$scope.$watchGroup(['var1','var2'],function(newVals,oldVals){
   console.log("new value of var1 = " newVals[0]);
   console.log("new value of var2 = " newVals[1]);
   console.log("old value of var1 = " oldVals[0]);
   console.log("old value of var2 = " oldVals[1]);
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.