Aslında, bir girdi açısal2 + 'da alt bileşende değiştiğinde algılama ve harekete geçmenin iki yolu vardır:
- NgOnChanges () yaşam döngüsü yöntemini eski yanıtlarda da belirtildiği gibi kullanabilirsiniz :
@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
}
Dokümantasyon Bağlantıları: ngOnChanges, SimpleChanges, SimpleChange
Demosu Örnek: Bu pistona bakın
- Alternatif olarak, aşağıdaki gibi bir girdi özelliği ayarlayıcı da kullanabilirsiniz :
private _categoryId: string;
@Input() set categoryId(value: string) {
this._categoryId = value;
this.doSomething(this._categoryId);
}
get categoryId(): string {
return this._categoryId;
}
Dokümantasyon Bağlantısı: Buraya bakın .
Demo Örneği: Bu dalma makinesine bakın .
HANGİ YAKLAŞIMI KULLANMALISINIZ?
Bileşeninizde birden fazla giriş varsa, ngOnChanges () kullanırsanız, ngOnChanges () içinde bir defada tüm girişler için tüm değişiklikleri alırsınız. Bu yaklaşımı kullanarak, değişen girişin mevcut ve önceki değerlerini karşılaştırabilir ve buna göre eylem yapabilirsiniz.
Ancak, yalnızca belirli bir giriş değiştiğinde (ve diğer girişleri umursamadığınızda) bir şey yapmak istiyorsanız, bir input özelliği ayarlayıcı kullanmak daha kolay olabilir. Ancak bu yaklaşım, değiştirilen girişin önceki ve geçerli değerlerini karşılaştırmak için yerleşik bir yöntem sağlamaz (ngOnChanges yaşam döngüsü yöntemiyle kolayca yapabilirsiniz).
EDIT 2017-07-25: AÇILI DEĞİŞİM ALGILAMA BAZI KOŞULLARIN ALTINDA YANAMAYABİLİR
Normalde, üst bileşen alt öğeye geçirdiği verileri her değiştirdiğinde, verilerin bir JS ilkel veri türü (dize, sayı, boole) olması koşuluyla, hem ayarlayıcı hem de ngOnChanges için değişiklik algılaması tetiklenir . Ancak, aşağıdaki senaryolarda, tetiklenmeyecektir ve çalışması için fazladan işlem yapmanız gerekir.
Üst öğeden Alt öğeye veri aktarmak için iç içe geçmiş bir nesne veya dizi (JS ilkel veri türü yerine) kullanıyorsanız, kullanıcı tarafından yanıt olarak da belirtildiği gibi değişiklik algılama (ayarlayıcı veya ngchanges kullanarak) tetiklenmeyebilir: muetzerich. Çözümler için buraya bakın .
Verileri açısal bağlamın dışında (yani harici olarak) değiştiriyorsanız, açısal değişiklikleri bilmeyecektir. Harici değişikliklerin açısal farkındalığını sağlamak ve böylece değişiklik algılamayı tetiklemek için bileşeninizde ChangeDetectorRef veya NgZone'u kullanmanız gerekebilir. Bakın bu .