2016-01-30 10 views
95

Wie erzwingt man die Neuberechnung einer Komponente in Angular 2? Für Debug-Zwecke mit Redux arbeiten möchte ich eine Komponente zwingen, seine Ansicht erneut zu rendern, ist das möglich?Wie erzwinge ich die Neuberechnung einer Komponente in Angular 2?

+0

Was meinen Sie mit "Neu-Rendering". Aktualisieren Sie die Bindungen? –

+0

Nur eine kurze Frage, warum Sie das Rendern erzwingen müssen? –

+4

Mögliches Duplikat von [Angular2-Änderungserkennung manuell auslösen] (http://stackoverflow.com/questions/34827334/triggering-angular2-change-detection-manual) – blo0p3r

Antwort

138

Rendering geschieht nach Änderungserkennung. Um Änderungserkennung zu erzwingen, so dass Komponente Eigenschaftswerte, die auf das DOM weitergegeben wird geändert haben (und dann wird der Browser diese Änderungen in der Ansicht machen), hier sind einige Optionen:

  • ApplicationRef.tick() - ähnlich wie Angular 1en $rootScope.$digest() - Überprüfen Sie den gesamten Komponentenbaum
  • NgZone.run(callback) - ähnlich wie $rootScope.$apply(callback) - dh, evaluieren Sie die Callback-Funktion innerhalb der Angular 2-Zone. Ich denke, aber ich bin mir nicht sicher, dass das den gesamten Komponentenbaum nach dem Ausführen der Callback-Funktion überprüft.
  • ChangeDetectorRef.detectChanges() - ähnlich wie $scope.$digest() - das heißt, überprüfen Sie diese Komponente nur und seine Kinder

Sie ApplicationRef injizieren können, NgZone oder ChangeDetectorRef in Ihrer Komponente.

Für Ihr spezielles Szenario würde ich die letzte Option empfehlen, wenn nur eine einzelne Komponente geändert wurde.

+3

versuchen alle zugreifen von ihnen aber immer noch nicht auf ios, traurig – vuhung3990

+1

Arbeitende Code auf ChangeDetectorRef für finale Version von angular2? Ich stehe jetzt vor einer Situation, in der die Ansicht nicht nach einer Post-Anforderung von http aktualisiert wird, um einen neuen Benutzer zu erstellen, und dann erfolgreich das neue Objekt zu der vorhandenen alten Benutzerliste schieben (die verwendet wird, um in der Ansicht zu iterieren). Ziemlich merkwürdig, dass "dies das erste Mal ist, dass ich mit einem Update konfrontiert werde, das in ng2 nicht funktioniert". Die Änderungserkennungsstrategie ist Standard, also weiß ich, dass ich die Change-Erkennungsstrategie nicht durcheinander gebracht habe. – Gary

+0

@Gary, sollten Sie eine neue Frage und fügen Sie Ihre Komponente und Ihre Service-Code (im Idealfall ein minimaler Plünderer, der das Problem zeigt). Ein häufiges Problem, das ich gesehen habe, ist nicht den richtigen "this" -Kontext im POST-Callback zu verwenden. –

33

tx, fand die Abhilfe, die ich brauchte:

constructor(private zone:NgZone) { 
    // enable to for time travel 
    this.appStore.subscribe((state) => { 
     this.zone.run(() => { 
      console.log('enabled time travel'); 
     }); 
    }); 

läuft zone.run wird die Komponente zwingen, erneut zu rendern

+3

Was ist appStore in diesem Kontext - welche Art von Variable und deren Typ? scheint beobachtbar zu sein ... aber meine Observable ist innerhalb der Komponente, die ich mit einem Klick auf eine Schaltfläche aktualisieren möchte ... und ich weiß nicht, wie auf eine Kind-Komponente Methode/Variable von Eltern/aktuellen Standort –

Verwandte Themen