2016-04-22 8 views
0

Ich habe Service, der asynchrone init Parameter hat und ich möchte, dass jeder Controller warten, bis die init abgeschlossen sein wird.ionic service init vor dem Laden Controller

Das Problem besteht darin, dass die Methode getObject vom Controller aufgerufen wird, bevor die Variable init der Parameter beendet wird.

Der Service:

angular.module('core') 
.factory('localstorage', ['$window', '$cordovaSQLite', '$q', 
function ($window, $cordovaSQLite, $q) { 
    var db; 
    var parameters = {}; 
    if (window.cordova) { 
    db = $cordovaSQLite.openDB({name: "my.db"}); //device 
    } else { 
    db = window.openDatabase("my.db", '1', 'life', 1024 * 1024 * 100); 
    } 

    var promise = $q(function (resolve, reject) { 
    $cordovaSQLite.execute(db, "SELECT * FROM life_table") 
     .then(function (res) { 
     if (res.rows.length == 0) { 
      $cordovaSQLite.execute(db, 
      "CREATE TABLE IF NOT EXISTS life_table (key text primary key, value text)"); 
     } 
     else { 
      for (var i = 0; i < res.rows.length; ++i) { 
      parameters[res.rows[i].key] = JSON.parse(res.rows[i].value); 
      } 
     } 
     resolve(parameters); 
     }); 
    }); 

    return { 
    promise: promise, 
    getObject: function (key) { 
     var query = "SELECT value FROM life_table where key = ?"; 
     $cordovaSQLite.execute(db, query, [key]).then(function (res) { 
     if (res.rows.length > 0) { 
      console.log("getObject: " + res.rows[0].value); 
     } 
     }, function (err) { 
     console.error(err); 
     }); 
     return parameters[key]; 
    } 
    } 
}]); 

die config:

.config(function ($stateProvider, $urlRouterProvider) { 
$stateProvider 

    .state('navigator', { 
    url: '/', 
    abstract: true, 
    controller: 'NavigatorCtrl', 
    resolve: { 
     'MyServiceData': function (localstorage) { 
     // localstorage will also be injectable in the controller 
     return localstorage.promise; 
     } 
    } 
    }) 

    .state('login', { 
    url: '/login', 
    templateUrl: 'templates/login.html', 
    controller: 'LoginCtrl', 
    controllerAs: 'loginCtrl', 
    resolve: { 
     'MyServiceData': function (localstorage) { 
     // localstorage will also be injectable in the controller 
     return localstorage.promise; 
     } 
    } 
    }) 

Antwort

0

Shalom Dor!

Option 1

eine Kette von Versprechungen machen und die Fabrik zurück, erst, nachdem alle Versprechen gelöst werden. Dies verhindert, dass der Controller ausgeführt wird, da die Factory-Abhängigkeit erst zurückgegeben wird, wenn die gewünschten Versprechen gelöst sind.

Option 2

eine Art Initialisierungsfunktion in Ihren Dienst erstellen, die ein Versprechen zurück (Sie $ q verwenden können). Führen Sie es innerhalb $ionicPlaform.ready() aus und führen Sie die Controller-Logik nur aus, nachdem Sie das Versprechen erhalten haben.

In der Steuerung:

MyService.initialize().then(function() { 
    // Service initialized, do stuff... 
}); 

Im Dienst:

returned.initialize = function() { 
    var d = q.defer(); 
    // Do stuff... 
    // Resolve 'd' when you finished initializing the service using 'd.resolve()'. 
    return d.promise; 
}; 
Verwandte Themen