TypeScript - @Input değer değişikliğini nasıl yakalayabiliriz
Bu girişe sahip bir bileşenim var:
@Input() list: Array<string>
Üst bileşen bu giriş değerini değiştirdiğinde bunu nasıl yakalayabilirim?
Cevap #1
ngDoCheck'i, diziye güncellemeler (ekleme ve/veya çıkarma) olduğunda manuel olarak tespit etmek için uygulayabilirsiniz. Varsayılan olarak Angular2 bu durumu algılamaz çünkü içeriğe değil, referanslara göre çalışır.
@Component({
(...)
})
export class SomeComponent implements DoCheck {
@Input() list: Array<string>;
constructor(private differ:KeyValueDiffer) {
}
ngDoCheck() {
var changes = this.differ.diff(this.list);
if (changes) {
changes.forEachAddedItem(r => {
// element added in the input array
});
changes.forEachRemovedItem(r => {
// element removed in the input array
});
}
}
ngFor yönergesi bu mekanizmaya dayanır.
Bu plunkr'a bakın: http://plnkr.co/edit/LVQqpjbLENZ7AZ2a6OTt?p=preview.
Cevap #2
OnChanges'i Uygula
ngOnChanges(changes) {
console.log(changes);
}
ngOnChanges, yalnızca değer dışarıdan Angular bağlamasıyla değiştirildiğinde çağrılır.
Eğer kod başka yollarla değiştirildiğinde çalıştırmak istiyorsanız, ayrıca şöyle bir getter/setter de yapabilirsiniz
_list:Array<string>;
@Input()
set input(newVal:Array<string>) {
this._list = newVal;
doSomething();
}
get input()Array<string> {
return this._list;
}
Bu, yalnızca başka bir dizi _list'e atanırken geçerlidir; aynı dizi üzerinde yapılan değişiklikleri kapsamaz.
