Mengatur objectEquality
parameter (parameter ketiga) dari $watch
fungsi jelas merupakan cara yang benar untuk menonton SEMUA properti array.
$scope.$watch('columns', function(newVal) {
alert('columns changed');
},true); // <- Right here
Piran menjawab ini dengan cukup baik dan menyebutkan $watchCollection
juga.
Lebih detail
Alasan saya menjawab pertanyaan yang sudah dijawab adalah karena saya ingin menunjukkan bahwa jawaban wizardwerdna bukan jawaban yang baik dan tidak boleh digunakan.
Masalahnya adalah bahwa pencernaan tidak terjadi dengan segera. Mereka harus menunggu sampai blok kode saat ini selesai sebelum dieksekusi. Dengan demikian, menonton length
array sebenarnya dapat melewatkan beberapa perubahan penting yang $watchCollection
akan ditangkap.
Asumsikan konfigurasi ini:
$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');
});
Sekilas, sepertinya ini akan menyala pada saat yang sama, seperti dalam kasus ini:
function pushToArray() {
$scope.testArray.push({val:3});
}
pushToArray();
// Console output
// length changed: 2 -> 3
// testArray changed
Itu cukup berhasil, tetapi pertimbangkan ini:
function spliceArray() {
// Starting at index 1, remove 1 item, then push {val: 3}.
$testArray.splice(1, 1, {val: 3});
}
spliceArray();
// Console output
// testArray changed
Perhatikan bahwa panjang yang dihasilkan adalah sama meskipun array memiliki elemen baru dan kehilangan elemen, sehingga jam tangan yang $watch
terkait length
tidak berubah. $watchCollection
mengambilnya, meskipun.
function pushPopArray() {
$testArray.push({val: 3});
$testArray.pop();
}
pushPopArray();
// Console output
// testArray change
Hasil yang sama terjadi dengan push dan pop di blok yang sama.
Kesimpulan
Untuk menonton setiap properti dalam array, gunakan a $watch
pada array itu sendiri dengan parameter ketiga (objectEquality) disertakan dan disetel ke true. Ya, ini mahal tapi terkadang perlu.
Untuk menonton saat objek masuk / keluar dari array, gunakan a $watchCollection
.
JANGAN gunakan $watch
pada length
properti array. Hampir tidak ada alasan bagus yang bisa saya pikirkan untuk melakukannya.
angular.equals
ketika argumen ketiga mengambil nilai boolean ?