Di AngularJS Anda dapat menentukan pengamat untuk mengamati perubahan dalam variabel lingkup menggunakan $watch
fungsi $scope
. Apa yang setara dengan mengawasi perubahan variabel (misalnya, variabel komponen) di Angular?
213
Di AngularJS Anda dapat menentukan pengamat untuk mengamati perubahan dalam variabel lingkup menggunakan $watch
fungsi $scope
. Apa yang setara dengan mengawasi perubahan variabel (misalnya, variabel komponen) di Angular?
Jawaban:
Di Angular 2, deteksi perubahan otomatis ...
$scope.$watch()
dan$scope.$digest()
RIPSayangnya, bagian Deteksi Perubahan panduan pengembang belum ditulis (ada pengganti di dekat bagian bawah halaman Tinjauan Arsitektur , di bagian "The Other Stuff").
Inilah pemahaman saya tentang cara kerja deteksi perubahan:
setTimeout()
di dalam komponen kita daripada sesuatu seperti$timeout
... karenasetTimeout()
monyet ditambal.ChangeDetectorRef
.) Detektor perubahan ini dibuat saat Angular membuat komponen. Mereka melacak keadaan semua ikatan Anda, untuk pemeriksaan kotor. Ini, dalam arti tertentu, mirip dengan otomatis$watches()
yang akan diatur oleh Angular 1 untuk{{}}
binding template.Tidak seperti Angular 1, grafik deteksi perubahan adalah pohon terarah dan tidak dapat memiliki siklus (ini membuat Angular 2 jauh lebih performan, seperti yang akan kita lihat di bawah).
onPush
strategi deteksi perubahan pada salah satu komponen Anda), setiap komponen di pohon diperiksa sekali (TTL = 1) ... dari atas, dalam urutan kedalaman-pertama. (Ya, jika Anda dalam mode dev, deteksi perubahan berjalan dua kali (TTL = 2). Lihat ApplicationRef.tick () untuk informasi lebih lanjut tentang ini.) Ini melakukan pemeriksaan kotor pada semua binding Anda, menggunakan perubahan objek detektor.Jika data komponen yang ingin Anda tonton adalah properti input primitif (String, boolean, number), Anda dapat menerapkan
ngOnChanges()
pemberitahuan perubahan.Jika properti input adalah tipe referensi (objek, array, dll.), Tetapi referensi tidak berubah (misalnya, Anda menambahkan item ke array yang ada), Anda harus menerapkan
ngDoCheck()
(lihat jawaban SO ini untuk lebih lanjut hal ini).Anda hanya boleh mengubah properti komponen dan / atau properti komponen turunan (karena implementasi walk tree tunggal - yaitu, aliran data searah). Di sini ada plunker yang melanggar itu. Pipa stateful juga dapat membuat Anda tersandung di sini.
Referensi lain untuk mempelajari lebih lanjut:
onPush
.sumber
host
, dokumentasi "Host Listeners" di DirectiveMetadata API doc . Ini menjelaskan cara mendengarkan acara global dari dalam zona Angular (jadi deteksi perubahan akan dipicu seperti yang diinginkan). Jawaban ini memiliki plunker yang berfungsi.Perilaku ini sekarang merupakan bagian dari siklus hidup komponen.
Sebuah komponen dapat mengimplementasikan metode ngOnChanges di antarmuka OnChanges untuk mendapatkan akses ke perubahan input.
Contoh:
sumber
Jika, selain pengikatan dua arah otomatis, Anda ingin memanggil fungsi saat suatu nilai berubah, Anda bisa memecah sintaks pintasan pengikatan dua arah ke versi yang lebih verbose.
<input [(ngModel)]="yourVar"></input>
adalah singkatan
<input [ngModel]="yourVar" (ngModelChange)="yourVar=$event"></input>
(lihat misalnya http://victorsavkin.com/post/119943127151/angular-2-template-syntax )
Anda dapat melakukan sesuatu seperti ini:
<input [(ngModel)]="yourVar" (ngModelChange)="changedExtraHandler($event)"></input>
sumber
Anda dapat menggunakan
getter function
atauget accessor
untuk bertindak sebagai menonton di sudut 2.Lihat demo di sini .
sumber
Berikut adalah pendekatan lain menggunakan fungsi pengambil dan penyetel untuk model.
sumber
(change)
handler (s) pada masing-masing dari mereka; Saya tidak ingin menambahkanget|sets
s ke setiap properti dalam model saya; tidak akan membantu menambahkanget|set
untukthis.object
;ngOnChanges()
hanya mendeteksi perubahan@Input
s . Manna suci! Apa yang mereka lakukan pada kita ??? Beri kami semacam pengawasan mendalam!Jika Anda ingin menjadikannya 2 cara mengikat, Anda dapat menggunakannya
[(yourVar)]
, tetapi Anda harus menerapkannyayourVarChange
acara dan menyebutnya setiap kali perubahan variabel Anda.Sesuatu seperti ini untuk melacak perubahan pahlawan
dan kemudian saat pahlawanmu diganti, teleponlah
this.heroChange.emit(this.hero);
itu
[(hero)]
mengikat akan melakukan sisanya untuk Andalihat contoh di sini:
http://plnkr.co/edit/efOGIJ0POh1XQeRZctSx?p=preview
sumber
Coba ini ketika aplikasi Anda masih menuntut
$parse
,$eval
,$watch
seperti perilaku di suduthttps://github.com/vinayk406/angular-expression-parser
sumber
Ini tidak menjawab pertanyaan secara langsung, tetapi pada kesempatan yang berbeda saya mendarat di pertanyaan Stack Overflow ini untuk menyelesaikan sesuatu yang saya akan gunakan $ watch for in angularJs. Saya akhirnya menggunakan pendekatan lain dari yang dijelaskan dalam jawaban saat ini, dan ingin membaginya jika ada yang merasa berguna.
Teknik yang saya gunakan untuk mencapai sesuatu yang serupa
$watch
adalah dengan menggunakanBehaviorSubject
( lebih banyak tentang topik di sini ) dalam layanan Angular, dan membiarkan komponen saya berlangganan untuk mendapatkan (melihat) perubahan. Ini mirip dengan$watch
di angularJs, tetapi membutuhkan lebih banyak pengaturan dan pemahaman.Dalam komponen saya:
Dalam pelayanan saya
Ini demo di Stackblitz
sumber