Wil*_*uce 9 typescript angular-material angular virtualscroll
我正在构建一个垂直滚动的日历。我正在加载最初的日子,但是当新的日子添加到列表中时,它们不会被呈现。
<cdk-virtual-scroll-viewport
class="demo-viewport"
[itemSize]="100"
(onContentScrolled)="handleScrollChange($event)"
>
<calendar-day
*cdkVirtualFor="let day of days; trackBy: trackByFn"
[day]="day"
></calendar-day>
</cdk-virtual-scroll-viewport>
<button (click)="goToToday()">go</button>
Run Code Online (Sandbox Code Playgroud)
我有一项BehaviorSubject更新天数的服务。我知道天数列表正在更新,但似乎没有检测到更改。
ngOnInit() {
this._daysService.days$.subscribe(days => {
this.days = days;
})
this.watchScroll();
this.handleScrollingUp();
this.handleScrollingDown();
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息,StackBlitz 存储库是公开的https://stackblitz.com/edit/material-infinite-calendar
在*cdkVirtualFor只进行更新,如果你更新它不可改变,即它被初始化后,您不能更新数组。我们使用价差运算符来获取您正在寻找的内容。
检查这个非常简单的stackblitz ...这里我使用了两种方法,您可以尝试查看:
addCountryOld 方法通过将对象推送到我们的数组来改变数组,因此渲染视图不会更新。addCountryNew 方法通过扩展运算符使用不变性,这导致渲染视图得到更新。这是addCountryNew的代码:
addCountryNew(){
let newObj = {'name':'stack overflow country', "code":'SO'};
this.myList = [...this.myList, newObj];
}
Run Code Online (Sandbox Code Playgroud)
我想通了。
最初,我通过像这样获取当前值来添加新的日子
let items = this.items$.value;
items.push(newItem);
this.items$.next(items)
Run Code Online (Sandbox Code Playgroud)
显然,这实际上是BehaviorSubject's value的值的突变,因此不会创建一个新数组来返回并且不会触发更改检测。
我把它改成
let items = [...this.items$.value];
items.push(newItem);
this.items$.next(items)
Run Code Online (Sandbox Code Playgroud)
一切都很好。
因此,尽管这里的答案是正确的,因为我正在改变原始数组,但我需要的信息是使用 mutated version的当前值调用的信息不会发出新数组。一个事件并不能保证不变性。next()BehaviorSubjectemit
| 归档时间: |
|
| 查看次数: |
8245 次 |
| 最近记录: |