2017-10-24 4 views
0

Ich habe eine Ansicht, in der ich Millisekunden präsentieren möchte, die seit der letzten Anfrage vergangen sind (so etwas wie ein Ping). z.B.Angular 4 ExpressionChangedAfterItHasBeenCheckedError mit Millisekunden - wie zu vermeiden

Ping: {{timePassed}} 

Und ich habe eine Komponente mit Getter:

get timePassed() { 
    return new Date().getTime() - this.lastPacket; 
} 

Natürlich, wenn wir bekommen timePassed zweimal, werden wir zwei verschiedene Werte erhalten (auch bei 1 ms Differenz). Und deshalb erhalten wir ExpressionChangedAfterItHasBeenCheckedError.

Ich bin mir völlig bewusst, warum dieser Fehler passiert, aber in diesem Fall besteht ich darauf, diesen Wert mit einer Genauigkeit von 1 ms zu haben.

Es wäre wirklich toll, die doppelte Überprüfung für diesen einen bestimmten Wert deaktivieren zu können.

Weiß jemand, wie man mit solch einem Problem umgeht?

Antwort

1

Sie können dies umgehen, indem Sie explizit die Änderung Triggerung

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

constructor(private cdr: ChangeDetectorRef) {} 

get timePassed() { 
    this.timePassed = new Date().getTime() - this.lastPacket; 
    this.cdr.detectionChanges(); 
} 
+0

Ist der gute Ansatz? Welche Konsequenzen/Nachteile hat das? –

+0

ja in der Tat! Normalerweise wird dies von Angular in diesem Fall irgendwie außerhalb Angulars Zone durchgeführt modifiziert Ihr Modell, dann können Sie die Änderungserkennung manuell wie – Sajeetharan

+0

in Ordnung aufrufen, aber werfen Sie einen Blick auf Ihre Methode. Du hast die Rückkehr vom Getter entfernt, die nicht gültig ist. Ist es möglich, detectionChanges() aufzurufen, bevor ein neuer Wert zurückgegeben wird? Ich vermute nicht. Ich möchte lieber vermeiden, zusätzliche Timeouts oder Intervalle zu erstellen. –

Verwandte Themen