【问题标题】:Angular change detection after template render模板渲染后的角度变化检测
【发布时间】:2023-03-11 06:00:01
【问题描述】:

所以我循环遍历我的 html 中的项目列表并设置调用函数以返回 true 或 false,以便我可以应用相应的类,如果任何项目匹配,我也会设置一个变量名单。 我将这个变量用于另一个元素作为 *ngIf。现在最初,在模板加载之前,这个变量是假的。之后,组件初始化并呈现 html。现在我有一个循环的项目列表,我在那里调用一个函数,它将该变量设置为 true,但以 ngIf 为条件的元素不可见。

我认为这是因为当组件完全初始化时,变量值为 false,然后当 html 呈现时,变量的值变为 true。但是这个变化并没有被 angular 检测到,因为它已经渲染了那个元素并且也没有得到任何变化事件来观察变量。

这是我的html

<div *ngIf="someVariable">
some content
</div>

<div *ngFor="let item of items">
  <div [ngClass]="{isItemMatched(item) : my-class}"></div>
</div>

这是我的组件

somevariable = false

isItemMatched(item) {
  forLoop() {
   if(true) {
      this.someVariable = true
      return true
     }
   }
}

有什么方法可以让我们触发角度变化检测,比如在点击事件或某些事情中,以便角度可以更新视图?

【问题讨论】:

  • 从视图绑定调用函数(当然事件处理程序除外)是非常糟糕的做法,并且在几乎所有情况下都不是您想要的。为每个项目准备一个包含数据和预先计算的isItemMatched 结果的数组,并在视图中绑定到该数组。
  • 你搞错了。在 Angular 中,您不需要迭代 HTML。您迭代生成 HTML 的 数据。更改您的数据,然后在*ngFor 循环中,根据您迭代的数据添加一个元素是否必须呈现的条件。
  • 谢谢大家,是的,我也认为这是一种不好的做法

标签: javascript html angular render angular-components


【解决方案1】:

首先,您以错误的方式使用 ngClass。 ngClass 的左边应该是类名,右边应该是布尔值。例如。

<div [ngClass]="{'my-class' : isItemMatched(item)}"></div>

要在值更改时更新视图,可以使用ChangeDetectorRef 在你的构造函数中注入这个类,然后使用方法 markForCheck()。此方法更新视图。

constructor(private cdr: ChangeDetectorRef){
}
someMethod(){
  this.someVariable = true; //Value changed.
  this.cdr.markForCheck(); //View updated.
}

【讨论】:

  • 是的,我知道类的事情,这是我为这个问题编写的一种伪代码,并在不知不觉中互换了它们。尽管我现在没有以这种方式设置该变量,因为它不好,但很高兴知道一种可以做到这一点的方法。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 2017-10-25
  • 2021-08-07
  • 2018-10-24
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
相关资源
最近更新 更多