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>

但这似乎使调用者变得不必要的复杂。

我宁愿 somehome 让 Lister 本身“听”它的列表更改。

有没有办法做到这一点?

4

1 回答 1

1

好的,这是 RTFM 的一个明显案例:答案是ngDoCheck,每次运行更改检测时都会调用它。

于 2016-09-08T13:30:11.527 回答