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
来自async
管道上的角度文档:
async
管道订阅Observable
或Promise
,并返回它发出的最新值。当发出新值时,async
管道会标记要检查的零部件以进行更改。当组件被破坏时,async
会自动管道unsubscribe
,以避免潜在的内存泄漏。
但从您的属性声明来看,它似乎是一个Array
。所以它不会起作用。
不要在此处初始化timers
属性,并将timers
的类型更改为Observable<ITimer[]>
类似这样的东西:
timers: Observable<ITimer[]>;
现在,它将取决于如何初始化timers
属性。不管你怎么做,只要确保它是Observable
更新:
根据您的用例,您可以将其作为Observable
s的数组。这是您已经拥有的。
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>
这里有一个工作样本StackBlitz供您参考。
或者
您也可以创建行为主题>:
timersArray: ITimer[] = [];
timers$: BehaviorSubject<Array<ITimer>> = new BehaviorSubject<Array<ITimer>>(this.timersArray);
然后在添加时,可以先更新timersArray
,然后通过调用timers$
:上的next
方法来更新BehaviorSubject
流
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>
这里有一个更新的StackBlitz供您参考。