このような List オブジェクトがあります
class List {
private urls: string[] = [];
public getNames(): Observable<string[]> {
// fetch all `this.urls` and extract the names
}
public addUrl(url: string) {
this.urls.push(url);
}
public hash(): string {
// generate a hash out of `this.urls`
}
}
基本的にいくつかの URL があり、これらの URL にある名前を提供できます。
これらの名前を表示するコンポーネントが必要です。
@Component({
selector: 'lister',
template: '<p *ngFor="let name of names|async">{{ name }}</p>'
})
class Lister implements OnChanges {
@Input() list: List;
private names: Observable<string[]>;
ngOnChanges() {
this.names = this.list.getNames();
}
}
これまでのところとても良いです。このように使用すると機能します
<lister [list]="somelist"></lister>
ただし、実際には何も変更しないため、呼び出されても更新somelist.addUrl(...)
されません。
回避策は、次のように変更するものを導入することです。
class Lister implements OnChanges {
// ...
@Input() hash: string;
}
それに応じて Lister を使用します。
<lister [list]="somelist" [hash]="somelist.hash()"></lister>
しかし、これは呼び出し元にとって不必要に複雑なようです。
私はどちらかというと、Lister 自体がリストの変更を「リッスン」するようにしたいと考えています。
これを達成する方法はありますか?