Sebenarnya, ada dua cara untuk mendeteksi dan bertindak ketika input berubah dalam komponen anak di angular2 +:
- Anda dapat menggunakan metode siklus hidup ngOnChanges () seperti juga disebutkan dalam jawaban yang lebih lama:
@Input() categoryId: string;
ngOnChanges(changes: SimpleChanges) {
this.doSomething(changes.categoryId.currentValue);
// You can also use categoryId.previousValue and
// categoryId.firstChange for comparing old and new values
}
Tautan Dokumentasi: ngOnChanges, SimpleChanges, SimpleChange
Demo Contoh: Lihat plunker ini
- Sebagai alternatif, Anda juga dapat menggunakan setter properti input sebagai berikut:
private _categoryId: string;
@Input() set categoryId(value: string) {
this._categoryId = value;
this.doSomething(this._categoryId);
}
get categoryId(): string {
return this._categoryId;
}
Tautan Dokumentasi: Lihat di sini .
Contoh Demo: Lihat plunker ini .
PENDEKATAN APA YANG HARUS ANDA GUNAKAN?
Jika komponen Anda memiliki beberapa input, maka, jika Anda menggunakan ngOnChanges (), Anda akan mendapatkan semua perubahan untuk semua input sekaligus dalam ngOnChanges (). Dengan menggunakan pendekatan ini, Anda juga dapat membandingkan nilai input saat ini dan sebelumnya yang telah berubah dan mengambil tindakan yang sesuai.
Namun, jika Anda ingin melakukan sesuatu ketika hanya satu input tertentu yang berubah (dan Anda tidak peduli dengan input lainnya), maka mungkin lebih mudah untuk menggunakan setter properti input. Namun, pendekatan ini tidak menyediakan cara bawaan untuk membandingkan nilai sebelumnya dan saat ini dari input yang diubah (yang dapat Anda lakukan dengan mudah dengan metode siklus hidup ngOnChanges).
EDIT 2017-07-25: DETEKSI PERUBAHAN ANGULAR MUNGKIN MASIH TIDAK KEBAKARAN DI BAWAH BEBERAPA SIRKUMSTAN
Biasanya, deteksi perubahan untuk penyetel dan ngOnChanges akan diaktifkan setiap kali komponen induk mengubah data yang dilewatinya kepada anak, asalkan data tersebut adalah tipe data primitif JS (string, number, boolean) . Namun, dalam skenario berikut, itu tidak akan menyala dan Anda harus mengambil tindakan tambahan untuk membuatnya berfungsi.
Jika Anda menggunakan objek atau array bersarang (alih-alih tipe data primitif JS) untuk meneruskan data dari Induk ke Anak, ubah deteksi (menggunakan penyetel atau ngchanges) mungkin tidak diaktifkan, seperti juga disebutkan dalam jawaban oleh pengguna: muetzerich. Untuk solusinya lihat di sini .
Jika Anda memutasikan data di luar konteks sudut (yaitu, secara eksternal), maka sudut tidak akan mengetahui perubahan. Anda mungkin harus menggunakan ChangeDetectorRef atau NgZone di komponen Anda untuk membuat sudut menyadari perubahan eksternal dan karenanya memicu deteksi perubahan. Lihat ini .