【问题标题】:ngFor does not update the dom fullyngFor 没有完全更新 dom
【发布时间】:2018-09-12 08:16:35
【问题描述】:

我在使用 ngFor 时遇到了一个奇怪的行为:

一般用法:我的后端存储了一个文本列表。用户可以显示此列表并获取由 ngFor 生成的列表,其中包含预设到列表内容的值。此外,他可以编辑文本并将更新的文本发送到后端。然后后端将更新整个列表并向所有客户端发送通知。如果其中一个客户端正在显示更新的列表,它会再次获取该列表,以便它是最新的。 (这种情况无论如何都发生在编辑身上,所以对编辑没有特别的威胁)

也许我的方法不是最好的,但问题是不同的: 新列表异步到达并得到更新。问题是用于编辑的文本将被“向下”推。当后端具有正确的列表以及新获取的列表正确到达客户端时,列表未正确显示。它必须有显示/更改检测问题。

我尝试了“track by”功能但没有成功。

最小的工作示例:

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  template: `<div *ngFor="let i of testList">
                <input type="text" [value]="i">
              </div>
  <button (click)="onClick()">Click</button>`,
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'test-app';
  testList = ["one", "two", "three", "", ""];

  onClick()
  {
    setTimeout(()=>{
      this.testList = ["one", "two", "three", "four", ""];
    }, 2000)
  }
}

在第四个文本字段中写一些东西,然后按下按钮。 2 秒后,您的文本应移至第 5 个字段。

Before Click

After Click and 2sec

Expected

提前谢谢你

【问题讨论】:

  • Angular 提供的双重绑定特性动态更新组件。因此,如果您后端的列表是这样的:["1","2","3","4","5"] 只需执行.subscribe( evt =&gt; this.testList = evt); 之类的操作,数据就会更新
  • 但这不正是我在示例中通过超时模拟的吗?
  • 我对答案的评论中的解决方案。

标签: angular ngfor


【解决方案1】:

这是 Angular shadow DOM 更新的行为。您可以像这样更改代码:

setTimeout(()=>{
  this.testList = ["one", "two", "three", "four", null];
}, 2000)

【讨论】:

  • 第一次出现此问题后,我尝试了一些解决方法,但很快就解决了(因为它不是关键问题)。在我创建了这个最小的例子之后,我尝试了更多,并找到了解决方案:stackoverflow.com/questions/40863074/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 2021-05-09
  • 2023-04-08
  • 2018-06-17
  • 2012-06-09
  • 1970-01-01
相关资源
最近更新 更多