Ich versuche, angular2 zu lernen und erstellte eine Testanwendung mit einem odata Webapi Backend. In der Anwendung habe ich eine Ansicht, die ein Array von Elementen abruft, und ich möchte diese aus meiner Sicht zeigen.Warum muss ich NgZone.run aufrufen, damit meine Ansicht in Angular2 mit breezejs aktualisiert wird?
Zum Abrufen von Daten aus dem Frontend verwende ich die breezejs-Bibliothek, da sie mir in der Vergangenheit viel Zeit erspart hat und ich sie gerne mit einem ODATA-Backend verwende.
Der Aufrufbaum und Anwendungsstruktur sieht wie folgt aus:
Anruf beginnt mit einer Servicefunktion aus der Sicht um die Elemente lostelefonieren holen (beachten Sie, dass ich von jedem Aufruf ein es-6 Versprechen kehre zurück):
this._scrumModuleService.fetchActiveSessions().then((sessions: ScrumSession[]) => {
// Here i have to call zone.run else my view wont update.
this._zone.run(() => {
this.sessions = sessions;
});
}).catch((error: any) => {
debugger;
});
Dann aus der Sicht es in den Dienst gehen, was wiederum das Repository ruft:
public fetchActiveSessions(): Promise<ScrumSession[]> {
return this._scrumSessionRepository.fetchActiveSessions();
}
die Reposi Tory holen Funktion:
public fetchActiveSessions(): Promise<ScrumSession[]> {
return this._dataContext.fetch(new breeze.EntityQuery().from("ScrumSessions").expand(['creator', 'scrumRoom','productOwner', 'users']));
}
Dann schließlich ruft das Repository die (allgemeine) Datacontext, die die Abfrage mit der Brise EntityManager ausführt:
public fetch(query: breeze.EntityQuery, isRetry: boolean = false): Promise<any> {
return new Promise((resolve, reject) => {
this.entityManager.executeQuery(query).then((result: breeze.QueryResult): void => {
// Data has been fetched, resolve the results
resolve(result.results);
});
});
}
Nun, wie Sie in der Ansicht sehen, ich habe um die run Funktion von NgZone zu benutzen oder meine Ansicht wird nicht aktualisiert. Ich frage mich, warum ich dies tun muss, da ich erwartet habe, dass angular2 das automatisch für mich sieht. Ich habe durch mehrere similair Fragen gegraben und konnte noch nicht wirklich eine Antwort finden. Ich habe auch das Skript angular2-polyfills wie in einem anderen Thread vorgeschlagen, aber das hat es nicht gelöst.
Was fehlt mir oder was muss ich implementieren, damit meine Ansicht automatisch aktualisiert wird, ohne zone.run aufzurufen?
Ich sehe, also bis Brise Unterstützung für angular2 bietet, würden Sie sagen, es ist am besten, nur zone.run für jetzt zu verwenden? –
Ja, benutze 'zone.run()' und stelle sicher, dass es einen Bugreport für breeys gibt, um es zu reparieren. –