【问题标题】:Angular Error: ExpressionChangedAfterItHasBeenCheckedError角度错误:ExpressionChangedAfterItHasBeenCheckedError
【发布时间】:2017-05-17 07:00:43
【问题描述】:

我对 Angular 4 有一点问题。 抛出下面的错误

错误:ExpressionChangedAfterItHasBeenCheckedError:表达式在检查后已更改。以前的值:'225px'。当前值:'-21150px'。

这是我的html:

<div class="channelRow" *ngFor="let epgChannel of channelGroupEpg?.epgChannels">
    <div class="epgChannelList">
      {{epgChannel.channel.name}}
    </div>
    <template ngFor let-epgDate [ngForOf]="epgChannel.dates">
        <div class="epgEntry" 
          *ngFor="let epgProgram of epgDate.programs" 
          [style.width]="getWidth(epgProgram, epgDate.date)" 
          (click)="selectProgram(epgProgram)" 
          data-toggle="modal" 
          data-target="#detailModal">
            {{epgProgram.title}}
        </div>
    </template>
</div>

这就是错误的来源:

getWidth(program: EPGProgram, date: Date) {
  let min = this.helperService.getDurationByProgramInMinutes(program);
  let startDate = new Date(program.start.getFullYear(), program.start.getMonth(), program.start.getDate(), 0, 0, 0, 0);
  let stopDate = new Date(program.stop.getFullYear(), program.stop.getMonth(), program.stop.getDate(), 0, 0, 0, 0);
  if (startDate.getTime() !== date.getTime()) {
      let minNextDay = this.helperService.getMinutesToNextDay(program.start, date);
      min = min - minNextDay;
  } 
  if (stopDate.getTime() !== date.getTime()) {
      let minNextDay = this.helperService.getMinutesToLastDay(program.stop, date);
      min = min - minNextDay;
  }
  let width = min * 5;
  return width.toString() + 'px';
}

谁能告诉我,为什么会这样?

【问题讨论】:

标签: angular runtime-error


【解决方案1】:

检查后组件状态发生变化...

使用

this._changeDetectionRef.detectChanges();

在方法的最后,不要忘记添加

private _changeDetectionRef : ChangeDetectorRef

作为拥有你的方法的组件的构造函数的参数。

见讨论here

【讨论】:

  • 这是经过 48 小时搜索我的问题的解决方案。
【解决方案2】:

快速解决方法是将代码放入 setTimeout() 中。

【讨论】:

    【解决方案3】:

    发生此错误是因为您在角度输出 HTML 之前更改了变量。 所以,你能做的就是。加载内容时更改变量。 解决方案。

    import { AfterContentInit } from '@angular/core';
    
    ngAfterContentInit(){
       // write your code here
    }
    

    【讨论】:

      【解决方案4】:

      我输出了同样的错误。经过长时间的研究,我发现这是由于在角度刷新 html 之前输入到 html 模板的数据发生了变化。切换到生产模式时不会显示此错误。请参阅此issue 了解更多信息。

      【讨论】:

      • prod 模式下不会显示该错误,但这并不意味着您应该忽略它。
      • 是的,当然,但有时您对此无能为力。例如,我在通过管道翻译 html 时遇到问题,我找不到运行另一轮新的更改检测的方法。到目前为止它没有造成任何问题
      • @Szarik,但有时您对此无能为力 - 这不是真的,有关原因的更多信息,请参阅 this article
      • @Maximus 它可以解决问题,但在我的情况下,我不得不在负责翻译的第三方组件中搞砸
      • @Szarik,我不知道你的具体情况,我只是在哪里详细说明了原因
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 2021-07-22
      • 2019-01-06
      • 2018-09-17
      • 2017-10-10
      • 1970-01-01
      相关资源
      最近更新 更多