Was ist die korrekte (kanonische) Möglichkeit zur Anzeige der aktuellen Zeit in Winkel 4 Change Detection System?
Das Problem ist wie folgt: aktuelle Zeit ändert sich ständig, jeden Moment, per Definition. Aber es ist nicht durch Angular 4 Change Detection System nachweisbar. Aus diesem Grund ist es meiner Meinung nach notwendig, explizit ChangeDetectorRef::detectChanges
zu nennen. Beim Aufruf dieser Methode ändert die aktuelle Zeit jedoch ihren Wert. Dies führt zu ExpressionChangedAfterItHasBeenCheckedError
. Im folgende Beispiel (see live) Dieser Fehler tritt withing ein paar Sekunden nach dem Laden der Seite:Angular 4 Display aktuelle Zeit
import { Component, ChangeDetectorRef } from '@angular/core';
@Component({
selector: 'my-app',
template: `{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />
{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}<br />{{ now }}`
})
export class AppComponent {
get now() : string { return Date(); }
constructor(cd: ChangeDetectorRef) {
setInterval(function() { cd.detectChanges(); }, 1);
}
}
Vielen Dank für diese ausführliche Erklärung, verdeutlicht es sehr. Ich wollte sicherstellen, dass dieses Beispiel ein fundamentaler Winkelfehler ist: Warum müssen wir explizit 'runOutsideAngular' aufrufen und die Intervalle außerhalb des Systems zur Erkennung von Winkeländerungen manuell manuell setzen? Widerspricht es nicht dem Rahmenparadigma? – BOPOHOB
Das ist kein Fehler. Die Änderungserkennung ist nicht für Aktualisierungen mit einer so hohen Rate vorgesehen, deshalb hat angular den Dienst "NgZone", der eine Möglichkeit bietet, Berechnungen manuell durchzuführen oder die Ansicht zu aktualisieren, ohne den Änderungsdetektionsalgorithmus aufzurufen. – cyrix
Lösung vom ersten Beispiel kann ExpressionChangedAfterItHasBeenCheckedError verursachen, d. H. Es gibt keine Möglichkeit, Zeit ohne direkten Elementzugriff anzuzeigen. Es gibt einen Fehler, den ich meine ... Korrekte Lösung gehen äußere Winkelschablone. In Google-Lösung von hier https://github.com/urish/angular2-moment ist es von Rohr eingewickelt, die viel besser aussieht – BOPOHOB