*ngfor 在这个例子中是如何工作的

Posted

技术标签:

【中文标题】*ngfor 在这个例子中是如何工作的【英文标题】:How is *ngfor works in this example 【发布时间】:2021-10-14 01:38:24 【问题描述】:

我不明白*ngfor 在这个例子中如何每次都运行并且只输出最后一个附加值,谁能给我解释一下? 如果每次数组Numberssetinterval 函数中更新,并且每次都会触发 ngfor,不应该每 1000 毫秒输出整个数组吗? 就像: 数字是 - 0 数字是 - 0 数字是 - 1 数字是 - 0 数字是 - 1 数字是 - 2 ...

结果是这样的: 数字是 - 0 数字是 - 1 数字是 - 2 数字是 - 3 ...

这里是应用根组件 TS

import Component from '@angular/core';

@Component(
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
)

export class AppComponent 

  interval = 0;
  lastNumber = 0;

  Numbers:number[] = [];

  TimeTick()
  
    this.interval = setInterval(() =>
    
      this.Numbers.push(this.lastNumber);
      this.lastNumber++;
    , 1000)
  

这是应用程序根组件 HTML

<div class="container">
  <div class="row">
    <div class="col-xs-12">
      <button class="btn btn-primary" (click)="TimeTick()">Start</button>
      <app-loop-x *ngFor="let num of Numbers" [number]="num"></app-loop-x>
    </div>
  </div>
</div>

这里是 app-loop-x TS

import Component, Input from '@angular/core';

@Component(
  selector: 'app-loop-x',
  templateUrl: './loop-x.component.html',
  styleUrls: ['./loop-x.component.css']
)

export class LoopXComponent 

  @Input() number: number = 0;

这是 app-loop-x HTML

<p>Number is -  number </p>

【问题讨论】:

【参考方案1】:

你不应该这样:

数字是 - 0 数字是 - 0 数字是 - 1 数字是 - 0 数字是 - 1 数字是 - 2

因为每一秒你都在推最后一个数字的值,然后你做 + 1 到最小数字(推后)

所以在 1 秒后你按下 0 并且你在 lastNumber 处 +1 所以下一秒你将按下 1 然后下一秒 2 ....

这是对那些台词的解释

    this.interval = setInterval(() =>
    
      this.Numbers.push(this.lastNumber);
      this.lastNumber++;
    , 1000)

【讨论】:

顺便说一下 ngFor 是由角度计时器触发的(当角度检测到变化或类似的事情时......)并且 ngFor 不仅显示最后一个,而是显示数组的所有元素。 (它遍历数组以获取每个数据,然后您决定将它们显示到 html 中)【参考方案2】:

当您更改数组 Numbers 的值时,*ngFor 指令会更新输出,它不会为每次更改创建新的输出。

变更传播 当迭代器的内容发生变化时,NgForOf 会对 DOM 进行相应的更改:

添加项目时,模板的新实例会添加到 DOM。

当一个项目被移除时,它的模板实例就会从 DOM 中移除。

当项目重新排序时,它们各自的模板在 DOM 中重新排序。

所以“最后一个值”不再存在,因为它已被新值覆盖。

一般来说,如果您有一个数组文本,例如 ['text1', 'another text']:

<h1 *ngFor="let txt of texts">txt</h1>

这将生成两个带有数组值的 h1 标签。

然后,如果将数组更改为 ['new text'],相同的 *ngFor 将更新,它只会生成一个带有 'new text' 值的 h1 标签,以及旧的 'text1' 和 'another text' h1 标签将从视野中消失。

您可以在official documentation 中阅读更多相关信息

在您的特定情况下,您正在向 DOM 添加元素,因此每次执行此操作时它都会创建一个新的模板实例。所以它在渲染整个数组时工作得很好。

【讨论】:

以上是关于*ngfor 在这个例子中是如何工作的的主要内容,如果未能解决你的问题,请参考以下文章

带有ngFor的Ionic 4水平滚动

/=/ 在 Netezza 中是啥意思?

为啥 int foo() 是一个右值,而 int& foo() 在这个例子中是一个左值?

实习的日志怎么写 要看几个例子

元组比较在 Python 中是如何工作的?

模块化代码在 Go 中是如何工作的?