2017-02-20 3 views
1

Ich bekomme den folgenden Fehler nur in Firefox. Nicht in Chrome oder IE.Angular 2 Change Detection Error: Der Ausdruck hat sich geändert, nachdem er überprüft wurde. Vorheriger Wert: "Über". Aktueller Wert: 'Seite'

Dies ist ein SideNav Styling aus Material Design, das dies wirft.

Hier ist die Linie 2 von DefaultLayoutComponent HTML-Vorlage:

<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')}"> 

Hier ist das Verfahren, in dem DefaultLayoutComponent Maschinenschrift die sidenavStyle zu bestimmen aufgerufen wird

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; 
    } 

I festgestellt haben, dass dies eine Änderungserkennungs ist Problem und ich fand diese stackoverflow Angular 2 - Expression has changed after it was checked, wo Gunter schlägt vor, ngOnChanges zu verwenden und dann diese Änderungen zu erkennen, aber ich werfe immer noch den Fehler.

Ich habe das versucht, aber ich werfe immer noch den Fehler. Jede Hilfe sehr geschätzt.

+0

Nicht versuchen, jemanden Arjan zu missbrauchen. Es tut mir leid, dass meine Zitate dich gestört haben, aber sie waren Teil meines HTML. Ich nehme an, Sie hatten ein Problem damit, dass ich meine Fehlermeldung zitierte. Ich werde versuchen, in Zukunft mehr darauf zu achten. Hoffe, du hast eine gute Woche. –

+0

Ich sehe jetzt, was du über Arjan sprichst. Vielen Dank. –

Antwort

0

Habe gerade eine Lösung für mein Problem.

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()' und 'this.changeDetectorRef.detectChanges()' scheint das Update zweimal durchzuführen. Wenn die Änderungserkennung nur in der aktuellen Komponente ausgeführt werden muss (weil nur 'this.idenavStyle') geändert wurde, ist' detectChanges' besser. Wenn Sie zum Beispiel 'this.router.navigate (...)' verwenden, sind weitere Komponenten betroffen, und 'ngZone.run()' ist die bessere Option, da sie die Änderungserkennung für die gesamte Anwendung aufruft. –

+0

Danke Gunter! –

0

hatte das gleiche Problem ... es für einen ganzen Tag debuggt, bis ich, dass es einen Namenskonflikt gefunden war: Es gibt eine Eigenschaft „userSchedule“ auf dem Controller deklariert war, dann aber eine Reihe von "es war userSchedules“, die in der folgenden Art und Weise wiederholt wurde:

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

alle arbeitete nach der Fein es an sich verändernde:

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

Anmerkung: in meinem Fall war es auch ein Firefox-olny Problem; die genaue Fehlermeldung war

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

Verwandte Themen