Apakah ada cara untuk berlangganan acara menggunakan banyak objek $watch
Misalnya
$scope.$watch('item1, item2', function () { });
Apakah ada cara untuk berlangganan acara menggunakan banyak objek $watch
Misalnya
$scope.$watch('item1, item2', function () { });
Mulai dari AngularJS 1.3 ada metode baru yang disebut $watchGroup
untuk mengamati serangkaian ekspresi.
$scope.foo = 'foo';
$scope.bar = 'bar';
$scope.$watchGroup(['foo', 'bar'], function(newValues, oldValues, scope) {
// newValues array contains the current values of the watch expressions
// with the indexes matching those of the watchExpression array
// i.e.
// newValues[0] -> $scope.foo
// and
// newValues[1] -> $scope.bar
});
$scope.$watchGroup(['mycustomctrl.foo', 'mycustomctrl.bar'],...
newValues
danoldValues
sebagaiundefined
, sementara individual menonton sifat bekerja seperti biasa.Dimulai dengan AngularJS 1.1.4 Anda dapat menggunakan
$watchCollection
:Contoh plunker di sini
Dokumentasi di sini
sumber
$watchCollection
dimaksudkan untuk menyerahkan objek dan memberikan arloji untuk perubahan pada salah satu properti objek, sedangkan$watchGroup
dimaksudkan untuk menyerahkan serangkaian properti individual untuk mengawasi perubahan. Sedikit berbeda untuk mengatasi masalah serupa namun berbeda. Fiuh!$watch
parameter pertama juga bisa menjadi fungsi.Jika dua nilai gabungan Anda sederhana, parameter pertama hanyalah ekspresi sudut secara normal. Misalnya, firstName dan lastName:
sumber
fullName = firstName + " " + lastName
mengharuskan lewatnya fungsi sebagai argumen pertama (daripada ekspresi sederhana seperti'firstName, lastName'
). Angular sangat kuat, tetapi ada beberapa area di mana ia bisa sangat ramah pengembang dengan cara yang tidak (tampaknya) mengganggu kinerja atau prinsip-prinsip desain.$scope.$watch('firstName + lastName', function() {...})
. Anda juga bisa hanya melakukan dua jam tangan:function nameChanged() {}; $scope.$watch('firstName', nameChanged); $scope.$watch('lastName', nameChanged);
. Saya menambahkan kasus sederhana ke jawabannya.Inilah solusi yang sangat mirip dengan kode semu asli Anda yang benar-benar berfungsi:
EDIT: Oke, saya pikir ini lebih baik:
Pada dasarnya kita melewatkan langkah json, yang tampaknya bodoh untuk memulai, tetapi tidak berhasil tanpa itu. Kuncinya adalah parameter ke-3 yang sering dihilangkan yang mengaktifkan kesetaraan objek dan bukan kesetaraan referensi. Kemudian perbandingan antara objek array yang kami buat benar-benar berfungsi dengan baik.
sumber
TypeError: Object #<Object> has no method '$watchCollection'
ini tetapi solusi ini membantu saya untuk menyelesaikan masalah saya!$scope.$watch('[chaptercontent.Id, anchorid]', function (newValues, oldValues) { ... }, true);
Anda dapat menggunakan fungsi dalam $ watchGroup untuk memilih bidang objek dalam ruang lingkup.
sumber
_this
? Bukankah ruang lingkup dimasukkan ke dalam fungsi tanpa secara eksplisit mendefinisikannya?Mengapa tidak membungkusnya dengan
forEach
?Ini tentang overhead yang sama dengan menyediakan fungsi untuk nilai gabungan, tanpa benar-benar harus khawatir tentang komposisi nilai .
sumber
changed()
dipanggil setiap kali ada perubahan di salah satu properti. Itu perilaku yang sama persis seolah-olah fungsi untuk nilai gabungan disediakan.Solusi yang sedikit lebih aman untuk menggabungkan nilai mungkin menggunakan yang berikut ini sebagai
$watch
fungsi Anda :atau
sumber
Parameter $ watch first dapat berupa ekspresi atau fungsi sudut . Lihat dokumentasi pada $ scope. $ Watch . Ini berisi banyak info berguna tentang cara kerja metode $ watch: ketika watchExpression dipanggil, cara angular membandingkan hasil, dll.
sumber
bagaimana tentang:
sumber
true
parameter ketiga to toscope.$watch
(seperti pada contoh Anda),listener()
akan diaktifkan setiap kali, karena hash anonim memiliki referensi yang berbeda setiap saat.return { a: functionA(), b: functionB(), ... }
. Saya kemudian memeriksa objek yang dikembalikan nilai baru dan lama terhadap satu sama lain.Di sini fungsi akan dipanggil saat usia dan nilai nama diubah.
sumber
Sudut diperkenalkan
$watchGroup
dalam versi 1.3 menggunakan yang kita dapat menonton beberapa variabel, dengan satu$watchGroup
blok$watchGroup
mengambil array sebagai parameter pertama di mana kita dapat memasukkan semua variabel kita untuk menonton.sumber