Angular / Ionic und async SQLite - Sicherstellung, dass die Datenfactory vor der Rückgabe initialisiert wird

8

Ich schreibe eine PhoneGap / Cordova App mit Ionic und verwende SQLite (mit ngCordova) für persistenten Speicher. Der Kern der App ist eine Scroll-Liste von Elementen, die aus der SQLite-Datenbank abgerufen werden.

listController.js

%Vor%

dataFactory.js

%Vor%

Anfangs gab ich die Fabrik sofort zurück. Der Controller hat getAllItems() ausgeführt, bevor die Daten bereit waren. Die Ansicht war zunächst leer und zeigte nach einer zweiten getAllItems()

nur noch etwas an, wenn sie zur Route zurückkehrte

Also habe ich versucht, die Rückgabe der Factory zu verzögern, indem ich eine FactoryReady () -Funktion hinzufügte und sie nur aufruft, sobald alle internen DB-Sachen fertig waren

%Vor%

Und jetzt gibt es einen undefinierten Fehler, da die gesamte -Fabrik beim ersten Aufruf nicht verfügbar ist, anstatt dass getAllItems() einfach mit leeren Händen zurückkehrt. Ich kann sehen, dass zu gegebener Zeit korrekt in die SQL-Datenbank geschrieben wird, aber Angular löst eine Ausnahme aus, bevor dies beendet ist.

Ich erkenne jetzt, dass dies vorhersehbar ist, ich habe den Beitrag AngularJS: Initialize gelesen Dienst mit asynchronen Daten , aber nicht ganz verstehen, wie man die bestplatzierte Antwort implementiert (von joakimbl)

Was ist der beste Weg, um den Dienst verfügbar zu machen und sicherzustellen, dass er nicht vom Controller aufgerufen wird, bis der interne Async-Vorgang beendet ist? Muss ich den GESAMTEN Service als Versprechen und nicht nur als Ergebnis von getAllItems zurückgeben? Ich habe es versucht, aber jetzt bin ich verwirrt. Danke.

BEARBEITEN

Ich habe auch die Verwendung von ui-routers resolve untersucht, als ich die Ansicht geladen habe Ссылка , aber das behebt nicht die interne Bereitschaft der SQL-Daten / -Factory. Wenn ich die Methode getAllCases zurücksende, wird sie sofort aufgerufen, es gibt noch nichts in der SQL-Datenbank, die SQL-Abfrage gibt eine leere Ergebnismenge zurück, das Versprechen wird aufgelöst und die Ansicht wird gerendert.

    
drjimmie1976 09.01.2015, 15:27
quelle

1 Antwort

7

Verwaltet, damit es am Ende funktioniert. Veröffentlichen Sie dies hier für jeden, der das Problem hat.

dataFactory.js

  • Überarbeitete alle privaten Methoden mit asynchronen SQL-Aufrufen in dataFactory.js , um Versprechen
  • zurückzugeben
  • Eine öffentliche initDB-Methode erstellt, die Aufrufe an die privaten Methoden verkettet (z. B. openDB & gt; & gt; dropTable_ & gt; & gt; createTable_ usw.). Gibt auch ein Versprechen (leer) zurück
  • Von sofort ab initDB und getAllItems() zurückgegeben

    %Vor%

app.js

  • Verwendet die resolve -Fähigkeit von ui-router
  • Meine vorherigen Versuche hatten Versprechen nicht richtig injiziert
  • Ein resolve wurde zum abstrakten Zustand auf oberster Ebene hinzugefügt, um den Aufruf von initDB abzubrechen
  • Die Zusage von initDB wurde an das resolve -Objekt des untergeordneten Status
  • übergeben
  • Injizieren Sie das auflösende Objekt in den Controller

    // APP ROUTING (mit dem UI-Router)   .config (Funktion ($ stateProvider, $ urlRouterProvider) {

    %Vor%

Alles funktioniert jetzt. Massiver Dank an diesen Beitrag für die Klärung meiner Verwendung von ui-Router Führen Sie Controller erst nach Abschluss der Initialisierung in AngularJS aus

    
drjimmie1976 14.01.2015, 17:19
quelle