objectEqualityफ़ंक्शन के पैरामीटर (तीसरे पैरामीटर) को सेट करना $watchनिश्चित रूप से सरणी के सभी गुणों को देखने का सही तरीका है।
$scope.$watch('columns', function(newVal) {
alert('columns changed');
},true); // <- Right here
पिरान इसका अच्छी तरह से उत्तर देता है और $watchCollectionसाथ ही उल्लेख भी करता है।
ज्यादा जानकारी
इसका कारण मैं पहले से ही उत्तर दिए गए प्रश्न का उत्तर दे रहा हूं, क्योंकि मैं यह बताना चाहता हूं कि विज़ार्डवर्ल्ड का उत्तर अच्छा नहीं है और इसका उपयोग नहीं किया जाना चाहिए।
समस्या यह है कि खुदाई तुरंत नहीं होती है। उन्हें कोड के वर्तमान ब्लॉक को पूरा करने से पहले इंतजार करना होगा। इस प्रकार, lengthएक सरणी को देखना वास्तव में कुछ महत्वपूर्ण बदलावों को याद कर सकता है जो $watchCollectionपकड़ लेंगे।
इस कॉन्फ़िगरेशन को मानें:
$scope.testArray = [
{val:1},
{val:2}
];
$scope.$watch('testArray.length', function(newLength, oldLength) {
console.log('length changed: ', oldLength, ' -> ', newLength);
});
$scope.$watchCollection('testArray', function(newArray) {
console.log('testArray changed');
});
पहली नज़र में, ऐसा लग सकता है कि ये एक ही समय में आग लगेंगी, जैसे कि इस मामले में:
function pushToArray() {
$scope.testArray.push({val:3});
}
pushToArray();
// Console output
// length changed: 2 -> 3
// testArray changed
यह काफी अच्छा काम करता है, लेकिन इस पर विचार करें:
function spliceArray() {
// Starting at index 1, remove 1 item, then push {val: 3}.
$testArray.splice(1, 1, {val: 3});
}
spliceArray();
// Console output
// testArray changed
ध्यान दें कि परिणामी लंबाई समान थी भले ही सरणी में एक नया तत्व है और एक तत्व खो गया है, इसलिए जैसा $watchकि चिंतित है, lengthबदल नहीं गया है। $watchCollectionइस पर उठाया, हालांकि।
function pushPopArray() {
$testArray.push({val: 3});
$testArray.pop();
}
pushPopArray();
// Console output
// testArray change
एक ही परिणाम एक ही ब्लॉक में एक धक्का और पॉप के साथ होता है।
निष्कर्ष
हर प्रॉपर्टी को ऐरे में देखने के लिए, $watchऐरे इटसेल्फ पर थर्ड पैरामीटर (ऑब्जेक्विटी) को शामिल करें और सही पर सेट करें। हां, यह महंगा है लेकिन कभी-कभी जरूरी है।
यह देखने के लिए कि ऑब्जेक्ट कब दर्ज करें / बाहर निकलें, ए का उपयोग करें $watchCollection।
सरणी $watchकी lengthसंपत्ति पर उपयोग न करें । लगभग कोई अच्छा कारण नहीं है जो मैं ऐसा करने के लिए सोच सकता हूं।
angular.equalsजब तीसरा तर्क बूलियन मान लेता है तो आप क्यों उपयोग कर रहे हैं ?