当前位置: 首页 > 知识库问答 >
问题:

角度:cdkVirtual用于不渲染新项目

范浩荡
2023-03-14

我在做一个垂直滚动的日历。我正在加载初始日期,但是当新的日期被添加到列表中时,它们没有被渲染。

<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

共有3个答案

董砚
2023-03-14

而不是

this.days = days;

this.days = [...days];

作品。https://stack blitz . com/edit/material-infinite-calendar-amcapx?file = src/app/calendar/calendar . component . ts

上官高畅
2023-03-14

我想通了。

最初,我是通过像这样抓取当前值来添加新天数

let items = this.items$.value;
items.push(newItem);
this.items$.next(items)

显然,这实际上是BehaviorSubject值的一个变异,因此不会创建一个新的数组来返回,也不会触发更改检测。

我把它改成了

let items = [...this.items$.value];
items.push(newItem);
this.items$.next(items)

一切都很好。

因此,尽管这里的答案是正确的,因为我正在改变原始数组,但我需要的信息是使用改变的版本调用Next()'s当前值不会发出新数组。emit事件不能保证不变性。

穆乐逸
2023-03-14

*cdkVirtualFor只有在您不可变地更新它时才会更新,即您无法在数组初始化后更新它。我们使用扩展运算符来获取您要查找的内容。

检查这个非常简单的stackblitz…这里我使用了两种方法,你可以尝试看看:

    < li> addCountryOld方法通过将对象推送到我们的数组来改变数组,因此呈现的视图不会更新。 < li> addCountryNew方法通过spread运算符使用不变性,从而导致渲染视图得到更新。

这是addCountry New的代码:

addCountryNew(){
    let  newObj = {'name':'stack overflow country', "code":'SO'};
    this.myList = [...this.myList, newObj];
  }
 类似资料:
  • 只是一个简单的问题。 让我们将这段代码作为IE: 是 NgIf 内的内容呈现然后从页面中隐藏,还是角度“知道”此 div 不会显示,因此甚至不渲染其中的内容?

  • 我有一个组件,我想在用户点击后显示/隐藏。 它是这样的: 和 只需将wasPressed属性适当地设置为true或false。我正在使用<代码> 问题是“我的按钮”的“渲染”属性的值。它明确地包括两个方面:解释和显示按钮。 只要始终存在(它只更改它的标签),仅在属性为真时才存在。否则它说: malformedXML:更新期间:找不到解释 我如何解决这个问题? 我不想恢复到在源代码中隐藏元素,所以我

  • 问题内容: 在我的Maven项目中,我创建了一个“ index.xhtml”文件。当我构建并运行该项目时,Web浏览器未显示任何内容。当我查看源代码时,仍然可以看到源代码,而不是普通的html标签。 我尝试通过以下方式创建XHTML文件: 选择项目,右键单击New ..并选择Other ..并选择“ Web”类别,然后选择JSF Page。 选择项目,右键单击New ..,然后选择Other ..

  • 问题内容: 如果我正在渲染而不是,则以下代码有效。 是否可以将玉器文件渲染为部分角度? 问题答案: 是的,有可能。看下面的链接 需要注意的两个重要点是: 代替和 在路由中添加以下内容:(代码用于node中的expressjs) 退出并重新启动节点/快速服务器。

  • 在我的一个项目中,我尝试在表格中显示Angular Components(例如自动完成下拉搜索)。由于我的要求(例如使用ctrl单击多次选择不同的单元格),我决定尝试使用handsontable。 我使用了handsontable渲染器并动态添加组件。 代码看起来像这样 matrix.component.ts 我当前的问题是渲染角度组件的生命周期。 我试过的东西: 什么都不做 尝试过的解决方案:什

  • 我在一个应用程序的前端原型上工作,该应用程序具有给定的JS、React和CoreUI4 React技术栈。我来自Python背景,在网络开发和我给定的技术堆栈方面没有太多经验。当我不得不开始使用钩子时,这一点变得很明显。 问题 我真的不明白为什么它不更新我的和/或不渲染。我需要一个条件渲染,我也使用。 我试图: 从我的主应用程序中传递一个更大的状态,一旦我启动条件逻辑(挂钩规则)就无法工作。 当我