Exp*_*lls 11 javascript asynchronous rxjs typescript angular
我正在尝试使用async管道*ngFor来显示异步获取的项目数组.
<ul>
<li *ngFor="let item of items | async; trackBy: trackPost">
{{item.text}}
</li>
</ul>
ngOnInit() {
// very simple http call; returns an array of [{id: 1, text: "something"}]
this.items = this.itemService.loadItems();
}
trackPost(index, item) { return item.id; }
Run Code Online (Sandbox Code Playgroud)
这很好用.然后我想添加一个项目:
async addItem(text) {
await this.itemService.addItem({text});
// reload items after adding
this.items = this.itemService.loadItems();
}
Run Code Online (Sandbox Code Playgroud)
这也有效,它会在添加后正确更新项目.
问题是它将重新加载整个数组,而不仅仅是附加项目.你可以通过动画注意到这一点(如果你动画中的项目).我知道我可以自己处理订阅并使用数组,但我想知道是否有办法使用异步管道执行此操作.
有没有办法让我将新项目添加到现有的observable?如果失败了,有没有办法让模板正确跟踪项目而不是将它们视为重新添加?
问题是您通过重新分配流this.items = this.itemService.loadItems();。因此,您的 Observableitems不会发出新值,Angular 将使用您的 trackBy 函数来跟踪该新值,而不是您更改 的引用items,从而导致 Angular 进行完全重新加载。
因此,只需更改addItem服务的 -function 即可将更新的值发送到之前通过 获得的 Observable loadItems。之后你只需调用
addItem(text) {
this.itemService.addItem({text});
}
Run Code Online (Sandbox Code Playgroud)
服务示例:
@Injectable()
export class Service {
private items: Array<string> = [];
private items$ = new Subject<Array<string>>();
loadItems(): Observable<Array<string>> {
return this.items$.asObservable();
}
addItem(text: string) {
this.items = [...this.items, text];
this.items$.next(this.items);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1536 次 |
| 最近记录: |