2016-11-07 2 views
0

Ich benutze Firebase in Angular2, um ein Objekt zu holen.Async-Datenbindung in Angular2 nimmt Zeit in Anspruch, auch nachdem Daten geladen wurden

import { Component, OnInit } from '@angular/core'; 
import { AngularFire, FirebaseObjectObservable } from 'angularfire2'; 
import { ActivatedRoute, Params } from '@angular/router'; 

@Component({ 
    selector: 'app-example', 
    templateUrl: './example.component.html', 
    styleUrls: ['./example.component.css'] 
}) 
export class ExampleComponent implements OnInit { 

    fireObj: FirebaseObjectObservable<any>; 

    constructor(private af: AngularFire, private route: ActivatedRoute) { 

    } 

    ngOnInit() { 

    this.route.params.forEach((params: Params) => { 
    let id = params['id']; 

     this.fireObj = this.af.database.object("/path/" + id); 

     this.fireObj.subscribe(data => { 
     if(data.$value !== null) { 
      console.log(data); 
     }else { 
      console.log("failed"); 
     } 
     }); 

    }); 
    } 
} 

Und ich bin Bindung fireObj in der Vorlage:

<p>{{ (fireObj | async)?.title }}</p> 

alles wie erwartet funktioniert gut, aber manchmal ist Konsole Anmeldung data (etwa nach 1 Sekunde), sondern dom/Vorlage wird immer aktualisiert, nachdem 5 -10 Sekunden.

Gibt es einen bestimmten Grund für dieses Verhalten?

+1

Meine einzige Vermutung ist, dass der asynchrone Anruf außerhalb von ngZone geschieht, versuchen Sie, in das –

+0

@SyntacticFructose zu schauen danke für Ihren Vorschlag, ich werde es untersuchen. Aber das Verhalten sollte konsequent bleiben, oder? Manchmal reagiert es normal. Ich habe auch bemerkt, dass das Ändern der 'id' von Pfadparameter zu normalem Verhalten führt, aber das erneute Laden der Seite (für die gleiche ID) einige Male das Problem verursacht. –

Antwort

0

Ich löste es durch explizite Aufruf run() Methode ngZone.

this.fireObj.subscribe(data => { 
    // some other code. 
    this._ngZone.run(() => {}); 
}); 

Ich weiß, dass dies nicht die beste Lösung ist, aber ich habe dafür gesorgt, dass _ngZone.run() nur einmal aufgerufen wird (dh während des ersten Rückruf) als danach Angular es normalerweise ist verbindlich.

Dank @SyntacticFructose für die Führung in die richtige Richtung.

Verwandte Themen