जवाबों:
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
});
$scope.$watchGroup(['mycustomctrl.foo', 'mycustomctrl.bar'],...
newValuesऔर oldValuesके रूप में undefinedकरते हुए अलग-अलग गुण सामान्य रूप से काम देख रहा है,।
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
});
प्लंकर यहां उदाहरण दें
यहाँ प्रलेखन
$watchCollectionका उद्देश्य एक वस्तु को सौंपना है और किसी भी वस्तु के गुणों में बदलाव के लिए एक घड़ी प्रदान $watchGroupकरना है , जबकि इरादा है कि परिवर्तनों के लिए देखने के लिए व्यक्तिगत गुणों की एक सरणी सौंपी जाए। इसी तरह की अलग-अलग समस्याओं से निपटने के लिए थोड़ा अलग है। ओह!
$watch पहला पैरामीटर एक फ़ंक्शन भी हो सकता है।
$scope.$watch(function watchBothItems() {
return itemsCombinedValue();
}, function whenItemsChange() {
//stuff
});
यदि आपके दो संयुक्त मूल्य सरल हैं, तो पहला पैरामीटर सामान्य रूप से एक कोणीय अभिव्यक्ति है। उदाहरण के लिए, पहला नाम और अंतिम नाम:
$scope.$watch('firstName + lastName', function() {
//stuff
});
fullName = firstName + " " + lastNameपहले तर्क (जैसे सरल अभिव्यक्ति 'firstName, lastName') के बजाय एक फ़ंक्शन पास करना आवश्यक है । कोणीय एसओ शक्तिशाली है, लेकिन कुछ ऐसे क्षेत्र हैं जहां यह उन तरीकों से बहुत अधिक डेवलपर के अनुकूल हो सकता है जो प्रदर्शन या डिजाइन सिद्धांतों से समझौता नहीं करते (प्रतीत होते हैं)।
$scope.$watch('firstName + lastName', function() {...})। तुम भी सिर्फ दो घड़ियों कर सकता है function nameChanged() {}; $scope.$watch('firstName', nameChanged); $scope.$watch('lastName', nameChanged);:। मैंने जवाब के लिए साधारण मामला जोड़ा।
यहां आपके मूल छद्म कोड के समान समाधान है जो वास्तव में काम करता है:
$scope.$watch('[item1, item2] | json', function () { });
संपादित करें: ठीक है, मुझे लगता है कि यह और भी बेहतर है:
$scope.$watch('[item1, item2]', function () { }, true);
मूल रूप से हम जोंस स्टेप को छोड़ रहे हैं, जो कि शुरुआत के साथ गूंगा लग रहा था, लेकिन यह इसके बिना काम नहीं कर रहा था। वे कुंजी प्रायः छोड़े गए 3 पैरामीटर हैं जो संदर्भ समानता के विपरीत ऑब्जेक्ट समानता को चालू करता है। तब हमारे बनाए सरणी वस्तुओं के बीच तुलना वास्तव में सही काम करती है।
TypeError: Object #<Object> has no method '$watchCollection'लेकिन यह समाधान मुझे मेरी समस्या को हल करने में मदद करता है!
$scope.$watch('[chaptercontent.Id, anchorid]', function (newValues, oldValues) { ... }, true);
आप कार्यक्षेत्र में किसी ऑब्जेक्ट के क्षेत्रों का चयन करने के लिए $ watchGroup में कार्यों का उपयोग कर सकते हैं।
$scope.$watchGroup(
[function () { return _this.$scope.ViewModel.Monitor1Scale; },
function () { return _this.$scope.ViewModel.Monitor2Scale; }],
function (newVal, oldVal, scope)
{
if (newVal != oldVal) {
_this.updateMonitorScales();
}
});
_this? क्या इसे स्पष्ट रूप से परिभाषित किए बिना कार्यों में गुंजाइश नहीं है?
क्यों नहीं बस एक में लपेट forEach?
angular.forEach(['a', 'b', 'c'], function (key) {
scope.$watch(key, function (v) {
changed();
});
});
यह संयुक्त मूल्य के लिए एक फ़ंक्शन प्रदान करने के रूप में एक ही ओवरहेड के बारे में है, वास्तव में मूल्य संरचना के बारे में चिंता किए बिना ।
changed()जब भी कुछ गुणों में से कुछ में परिवर्तन किया जाता है। यह ठीक वैसा ही व्यवहार है जैसे कि संयुक्त मूल्य के लिए एक फ़ंक्शन प्रदान किया गया था।
मानों को संयोजित करने के लिए थोड़ा सा सुरक्षित समाधान आपके $watchफ़ंक्शन के रूप में निम्नलिखित का उपयोग कर सकता है :
function() { return angular.toJson([item1, item2]) }
या
$scope.$watch(
function() {
return angular.toJson([item1, item2]);
},
function() {
// Stuff to do after either value changes
});
$ घड़ी पहला पैरामीटर कोणीय अभिव्यक्ति या फ़ंक्शन हो सकता है। $ गुंजाइश पर प्रलेखन देखें । $ घड़ी । इसमें बहुत सी उपयोगी जानकारी है कि $ घड़ी विधि कैसे काम करती है: जब watchExpression कहा जाता है, तो कोणीय परिणामों की तुलना कैसे करता है, आदि।
कैसा रहेगा:
scope.$watch(function() {
return {
a: thing-one,
b: thing-two,
c: red-fish,
d: blue-fish
};
}, listener...);
trueपैरामीटर के बिना scope.$watch(आपके उदाहरण के अनुसार), listener()हर एक बार आग लगाएगा, क्योंकि हर बार अनाम हैश का एक अलग संदर्भ होता है।
return { a: functionA(), b: functionB(), ... }:। मैं तब एक दूसरे के खिलाफ नए और पुराने मूल्यों की लौटी हुई वस्तुओं की जांच करता हूं।
$scope.$watch('age + name', function () {
//called when name or age changed
});
यहां फ़ंक्शन को तब बुलाया जाएगा जब उम्र और नाम का मूल्य दोनों बदल जाएंगे।
कोणीय $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]);
});