1

このような 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 自体がリストの変更を「リッスン」するようにしたいと考えています。

これを達成する方法はありますか?

4

1 に答える 1

1

OK、これは RTFM の明確なケースです。答えはngDoCheckで、変更検出が実行されるたびに呼び出されます。

于 2016-09-08T13:30:11.527 に答える