javascript - Angular:cdkVirtualFor 不渲染新项目
问题描述
我正在构建一个垂直滚动的日历。我正在加载最初的日子,但是当新的日子被添加到列表中时,它们不会被渲染。
<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>
我有一项BehaviorSubject
更新日期的服务。我知道日期列表正在更新,但似乎没有检测到更改。
ngOnInit() {
this._daysService.days$.subscribe(days => {
this.days = days;
})
this.watchScroll();
this.handleScrollingUp();
this.handleScrollingDown();
}
有关更多信息,StackBlitz 存储库是公开的https://stackblitz.com/edit/material-infinite-calendar
解决方案
只有当*cdkVirtualFor
你不可变地更新它时才会更新它,即在初始化后你不能更新数组。我们使用扩展运算符来获取您要查找的内容。
检查这个非常简单的stackblitz ...在这里我使用了 2 种方法,您可以尝试看看:
addCountryOld
方法通过将对象推送到我们的数组来改变数组,因此渲染的视图不会更新。addCountryNew
方法通过扩展运算符使用不变性,从而导致渲染视图得到更新。
这是addCountryNew的代码:
addCountryNew(){
let newObj = {'name':'stack overflow country', "code":'SO'};
this.myList = [...this.myList, newObj];
}
推荐阅读
- c++ - 使用 LuaBridge 导出容器类
- javascript - js范围和窗口对象?
- c++ - 为什么函数指针比虚方法执行得更好
- python - 有没有办法将数据库的强大功能与文本文件库的透明性和简单性结合起来?
- mysql - 无法按照官方结构连接到 mysql docker 容器
- java - 将单个xml节点转换为java类
- reactjs - Ant Design - 欧元金额的数字输入
- sql - 特定值的 where 子句中的情况 oracle
- javascript - 如何在javascript中将数组作为对象传递?
- laravel - 我想在 Laravel 中将用户模型分成 2 个模型