Fonksiyonun objectEqualityparametresini (üçüncü parametre) ayarlamak, $watchdizinin TÜM özelliklerini izlemek için kesinlikle doğru yoldur.
$scope.$watch('columns', function(newVal) {
alert('columns changed');
},true); // <- Right here
Piran buna yeterince cevap veriyor ve bahsediyor $watchCollection.
Daha fazla detay
Zaten cevaplanmış bir soruyu cevaplamamın nedeni, wizardwerdna'nın cevabının iyi olmadığını ve kullanılmaması gerektiğini belirtmek istiyorum.
Sorun, sindirimlerin hemen gerçekleşmemesi. Yürütmeden önce geçerli kod bloğunun tamamlanmasını beklemek zorundalar. Böylece, lengthbir dizi izlemek aslında $watchCollectionyakalayacak bazı önemli değişiklikleri kaçırabilir .
Bu yapılandırmayı kabul edin:
$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');
});
İlk bakışta, bu durumda olduğu gibi aynı anda ateş ediyor gibi görünebilir:
function pushToArray() {
$scope.testArray.push({val:3});
}
pushToArray();
// Console output
// length changed: 2 -> 3
// testArray changed
Bu yeterince iyi çalışıyor, ancak şunu düşünün:
function spliceArray() {
// Starting at index 1, remove 1 item, then push {val: 3}.
$testArray.splice(1, 1, {val: 3});
}
spliceArray();
// Console output
// testArray changed
Dizi böylece seyretmek gibi, yeni bir öğe vardır ve bir öğe kaybetti gerçi çıkan uzunluk aynı hatta oldu Bildirimi olduğu $watchkonusu olduğunda, lengthdeğişmedi. $watchCollectionYine de aldı.
function pushPopArray() {
$testArray.push({val: 3});
$testArray.pop();
}
pushPopArray();
// Console output
// testArray change
Aynı sonuç, aynı blokta bir it ve patla ile olur.
Sonuç
$watchDizideki her özelliği izlemek için , üçüncü parametrenin (objectEquality) dahil olduğu dizinde bir a kullanın ve true olarak ayarlayın. Evet, bu pahalı ama bazen gerekli.
Nesne diziye girdiğinde / diziden çıktığında izlemek için a tuşunu kullanın $watchCollection.
Bir KULLANMAYIN $watchüzerine lengthdizinin özelliği. Bunu düşünebilmem için neredeyse hiçbir iyi neden yok.
angular.equalsÜçüncü argüman bir boole değeri aldığında neden kullanıyorsunuz ?