Fonksiyonun objectEquality
parametresini (üçüncü parametre) ayarlamak, $watch
dizinin 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, length
bir dizi izlemek aslında $watchCollection
yakalayacak 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 $watch
konusu olduğunda, length
değişmedi. $watchCollection
Yine 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ç
$watch
Dizideki 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 length
dizinin ö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 ?