timers: Observable<ITimer>[]=[];
模板是:
<div *ngFor="let item of timers | async">
{{ item.time }}
<div (click)="remove(item.index)">Remove</div>
</div>
为什么会出现此错误?
如果未初始化this.timers
,则异步有效。另外,我无法使用这种方法:
add() {
let options = {
finishDate: null,
time: null,
index: this.timers.length
};
this.timers.push(this.create(options));
}
在一行:index: this.timers.length
答案 0 :(得分:0)
从async
管道上的Angular Docs:
async
管道订阅Observable
或Promise
并返回其发出的最新值。发出新值时,async
管道标记要检查的组件是否有更改。销毁组件后,async
管道unsubscribe
会自动运行,以避免潜在的内存泄漏。
但是从您的属性声明中,它似乎是Array
。这样就行不通了。
请勿在此处初始化timers
属性,并将timers
的类型更改为Observable<ITimer[]>
类似这样的东西:
timers: Observable<ITimer[]>;
现在,这取决于您如何初始化timers
属性。但是,您只要确保它是Observable
根据您的用例,您可以将其制作为Observable
数组。这是您已经拥有的东西。
timers: Observable<ITimer>[]=[];
您只是在错误的位置使用async
管道。试试这个:
<div *ngFor="let item$ of timers">
<div *ngIf="(item$ | async) as item">
{{ item.time }}
<div (click)="remove(item.index)">Remove</div>
</div>
</div>
这是您推荐的Working Sample StackBlitz。
您还可以创建一个BehaviorSubject>:
timersArray: ITimer[] = [];
timers$: BehaviorSubject<Array<ITimer>> = new BehaviorSubject<Array<ITimer>>(this.timersArray);
然后添加时,可以先在timersArray
上调用BehaviorSubject
方法来更新next
,然后更新timers$
流:
add() {
let options = {
finishDate: null,
time: new Date(),
index: this.timers.length
};
this.timers.push(this.create(options));
this.timersArray.push(options);
this.timers$.next(this.timersArray);
}
然后您可以在模板中使用它:
<div *ngFor="let item of (timers$ | async)">
{{ item.time }}
<button (click)="remove(item.index)">Remove</button>
</div>
这里是Updated StackBlitz供您参考。