我有一个 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 本身“听”它的列表更改。
有没有办法做到这一点?