【问题标题】:Render delay for *ngIf due to filters causing expression change - Angular由于过滤器导致表达式更改,*ngIf 的渲染延迟 - Angular
【发布时间】:2019-10-01 06:09:01
【问题描述】:
ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'ngIf: false'. Current value: 'ngIf: true'.

我在控制台中收到上述“警告”。我有一堆过滤器可以隐藏/显示 ngFor 循环中的项目。当过滤器没有匹配时,例如没有 ngFor 孩子们 我提示 ngIf 显示一条优雅的消息。

这就是我的做法......

Component.ts

<!-- Returned contact logs -->
<ul #personTimeline>
  <my-timeline-entry
    *ngFor="let entry of contactLog | filter:filteredContactReason:'contactReason'"
    logEntryDateTime={{entry.dateTime}} logEntryNotes={{entry.notes}}>
  </my-timeline-entry>
</ul>


<!-- No results returned -->
<div *ngIf="!personTimeline.children.length">
    <div class="alert alert-warning" role="alert">
      <strong>{{startDate}} Sorry!{{' '}}</strong>No contact log matches found.
    </div>
</div>

通过使用#personTimeline,我检查了它的children.length。当为“0”时,它显示我的无结果 div。

我已经更改了一些内容,并重构了一些代码,现在该消息仅在我“在”第一次看到应该看到无结果 div 的空白区域之后进行交互时出现。一旦我单击一个元素,就会出现无结果消息。

我知道我可能需要介绍ngOnChanges?因为这是一个生命周期问题,但不确定如何定位我的 #personTimeline 句柄,还是我需要通过该句柄以某种方式触发 *ngIf="!personTimeline.children.length"

或者有没有更好的方法来实现不显示结果?

一如既往地感谢任何帮助或建议。

【问题讨论】:

  • 我看到了一些关于 markForCheck 的想法,想知道这里是否可以选择?
  • 在 ts 文件中使用 markForCheck 非常棒。如果你在 html 中做这一切,它也不会工作。如果您注释掉您的无结果 div,您的错误会消失吗?通常这种类型的错误与角度检测所有变化时信息的变化有关。
  • 是的,如果我注释掉 no-results div,错误就会消失

标签: javascript angular typescript


【解决方案1】:

这个链接有一个漂亮的解释:https://stackoverflow.com/a/47061845/9045615

基本上,这是因为在开发模式下,Angular 的变更检测会在每次常规变更检测之后添加额外的检查,以检查两种变更检测机制之间是否有任何值、模型或任何属性发生了变化。

但是,我有一个使用 ChangeDetectionRef 的快速修复/破解方法:

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

export class Component implements AfterViewInit {
  constructor(public changeDetectorRef: ChangeDetectorRef) { }
  // Try ngAfterContentInit  if ngAFterViewInit() doesn't work for you.
  ngAfterViewInit() {
    this.changeDetectorRef.detectChanges();
  }
}

其他文章阅读:https://angular.io/api/core/ChangeDetectorRef

【讨论】:

  • 不幸的是,在我的情况下这两个选项都不起作用 - 感谢您提供链接
猜你喜欢
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多