2017-02-20 85 views
1

我在Firefox中出現以下錯誤。不在Chrome或IE中。角度2更改檢測錯誤:檢查後表達式已更改。之前的值:'over'。當前值:'side'

"Error: Error in ./DefaultLayoutComponent class DefaultLayoutComponent - inline template:2:14 caused by: Expression has changed after it was checked. Previous value: 'over'. Current value: 'side'.」.

這是從材料設計拋出這個sidenav造型。

這裏是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(); 
} 

我試過這個,但我仍然在拋出錯誤。任何幫助不勝感激。

+0

沒有試圖濫用任何人Arjan。我很抱歉我的報價困擾你,但他們是我的HTML的一部分。我想你在引用我的錯誤消息時遇到了問題。我將在未來嘗試更加註意這一點。希望你有一個愉快的一週。 –

+0

我現在看到你在說什麼Arjan。謝謝。 –

回答

0

剛剛解決了我的問題。

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

'ngZone.run()'和'this.changeDetectorRef.detectChanges()'似乎在做兩次修復。如果只需要在當前組件中執行更改檢測(因爲只有'this.sidenavStyle'),則「detectChanges」更好。如果你這樣做'this.router.navigate(...)',那麼更多的組件會受到影響,'ngZone.run()'是更好的選擇,因爲它會調用整個應用程序的變更檢測。 –

+0

謝謝Gunter! –

0

有同樣的問題...調試了整整一天,直到我發現有一個命名衝突:有一個屬性「userSchedule」控制器上宣佈,但隨後出現了的「數組userSchedules」,這是通過以下方式迭代:

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

注:

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

一切都將其更改爲後工作正常,在我的情況下,它也是一個Firefox在唯的問題;確切的錯誤信息是

Expression has changed after it was checked. Previous value 'false'. Current value 'true'.

相關問題