Saya ingin melihat perubahan dalam kamus, tetapi untuk beberapa alasan menonton panggilan balik tidak dipanggil.
Berikut adalah pengontrol yang saya gunakan:
function MyController($scope) {
$scope.form = {
name: 'my name',
surname: 'surname'
}
$scope.$watch('form', function(newVal, oldVal){
console.log('changed');
});
}
Ini biola .
Saya berharap $ watch callback dipecat setiap kali nama atau nama keluarga diubah, tetapi itu tidak terjadi.
Apa cara yang benar untuk melakukannya?
javascript
angularjs
angularjs-scope
Vladimir Sidorenko
sumber
sumber
Jawaban:
Panggil
$watch
dengantrue
sebagai argumen ketiga:Secara default ketika membandingkan dua objek kompleks dalam JavaScript, mereka akan diperiksa untuk "referensi" kesetaraan, yang menanyakan apakah kedua objek merujuk pada hal yang sama, bukan "nilai" kesetaraan, yang memeriksa apakah nilai semua properti dari mereka benda sama.
Per dokumentasi Angular , parameter ketiga adalah untuk
objectEquality
:sumber
true
, maka itu akan memeriksa kesetaraan referensi jika nilai yang ditonton adalah objek atau array. Dalam hal ini, Anda harus menentukan properti secara eksplisit, seperti$scope.$watch('form.name')
dan$scope.$watch('form.surname')
The
form
objek tidak berubah, hanyaname
propertibiola diperbarui
sumber
Sedikit tip kinerja jika seseorang memiliki jenis layanan datastore dengan pasangan kunci -> nilai:
Jika Anda memiliki layanan yang disebut dataStore , Anda dapat memperbarui cap waktu setiap kali objek data besar Anda berubah. Dengan cara ini, alih-alih memperhatikan seluruh objek, Anda hanya melihat stempel waktu untuk perubahan.
Dan dalam arahan Anda hanya menonton cap waktu untuk berubah
sumber
newVal
,oldVal
dalam contoh ini adalah nilai timestamp bukan nilai objek yang diamati. Itu tidak membuat jawaban ini tidak valid, saya hanya berpikir bahwa itu adalah kelemahan yang layak disebut.Alasan mengapa kode Anda tidak berfungsi adalah karena
$watch
secara default memeriksa referensi. Jadi singkatnya itu memastikan bahwa objek yang dilewati adalah objek baru. Tetapi dalam kasus Anda, Anda hanya memodifikasi beberapa properti dari objek form yang tidak membuat yang baru. Untuk membuatnya berfungsi, Anda dapat lulustrue
sebagai parameter ketiga.Ini akan bekerja tetapi Anda dapat menggunakan $ watchCollection yang akan lebih efisien daripada $ watch karena
$watchCollection
akan mengawasi properti dangkal pada objek form. Misalnyasumber
Saat Anda mencari perubahan bentuk objek, pendekatan menonton terbaik adalah menggunakan
$watchCollection
. Silakan lihat dokumentasi resmi untuk karakteristik kinerja yang berbeda.sumber
Coba ini:
sumber
Bagi siapa pun yang ingin melihat perubahan pada objek dalam array objek, ini sepertinya berhasil bagi saya (seperti solusi lain pada halaman ini tidak):
sumber
sumber