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()
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.
Verwaltet, damit es am Ende funktioniert. Veröffentlichen Sie dies hier für jeden, der das Problem hat.
dataFactory.js
openDB
& gt; & gt; dropTable_
& gt; & gt; createTable_
usw.). Gibt auch ein Versprechen (leer) zurück
Von sofort ab initDB
und getAllItems()
zurückgegeben
app.js
resolve
-Fähigkeit von ui-router
resolve
wurde zum abstrakten Zustand auf oberster Ebene hinzugefügt, um den Aufruf von initDB
abzubrechen
initDB
wurde an das resolve
-Objekt des untergeordneten Status 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
Tags und Links javascript angularjs sqlite ionic-framework