角度2变化检测错误:检查后表达式已更改。之前的价值:'结束'。当前价值:'方'

时间:2017-02-20 04:01:30

标签: angular

我在Firefox中遇到以下错误。不在Chrome或IE中。

  

“错误:./DefaultLayoutComponent类中的错误DefaultLayoutComponent - 内联模板:2:14导致:表达式在检查后发生了变化。上一个值:'over'。当前值:'side'。”。

这是一种侧面的样式,从材料设计中抛出这一点。

这是DefaultLayoutComponent html模板的第2行:

<md-sidenav (mouseover)="toggleHover(true)" (mouseout)="toggleHover(false)" (close)="sidenavToggle(false)" (open)="sidenavToggle(true)" [mode]="(_navigation.mediumScreenAndDown && sidenavStyle !== 'off') ? 'over':sidenavMode" [ngClass]="{'icon-sidenav': ((sidenavStyle === 'icon' || sidenavStyle === 'icon overlay') && _navigation.largeScreen), 'over': (sidenavStyle === 'icon overlay')}">

这是DefaultLayoutComponent打字稿中被调用以确定sidenavStyle的方法

  public get sidenavMode(): string {
      if(this.sidenavStyle === 'icon overlay' && this.isHovering) {
          return 'over';
      } else if(this.sidenavStyle === 'icon' || this.sidenavStyle === 'icon overlay') {
         return 'side';
      } else if(this.sidenavStyle === 'hidden') {
         return 'over';
      } else if(this.sidenavStyle === 'off') {
         return 'over';
      }
      return this.sidenavStyle;
  }

我已经确定这是一个更改检测问题,我发现这个stackoverflow Angular 2 - Expression has changed after it was checked,其中Gunter建议使用ngOnChanges然后检测这些更改,但我仍然抛出错误。

ngOnChanges() {
    this.sidenavMode; //method where I am determining sidenav style
    this.changeDetectorRef.detectChanges();
}

我试过这个,但我仍在抛出错误。任何帮助非常感谢。

2 个答案:

答案 0 :(得分:0)

刚刚解决了我的问题。

constructor(private changeDetectorRef:ChangeDetectorRef, ngZone: NgZone) {
    window.onresize = (e) => {
      ngZone.run(() => {
        //console.log("this.sidenavStyle = " + this.sidenavStyle);
        this.sidenavStyle;
        this.changeDetectorRef.detectChanges();
      });
    };
}

答案 1 :(得分:0)

有同样的问题...调试了一整天,直到我发现存在命名冲突:在控制器上声明了一个属性“userSchedule”,但是有一个“userSchedules”数组,这是以下列方式迭代:

<div *ngFor="let userSchedule of userSchedules; let row = index">
  {{ userSchedule.customer }}
</div>

在将其更改为:

后,一切正常
<div *ngFor="let userScheduleRow of userSchedules; let row = index">
    {{ userScheduleRow.customer }}
</div>

注意:在我的情况下,它也是一个Firefox-olny问题;确切的错误信息是

  

检查后表情发生了变化。先前的值'false'。当前值'true'。