2016-04-22 147 views
0

我有服務,它有參數的異步初始化,我希望每個控制器都要等到init完成。加載控制器之前的離子服務初始化

問題是在參數變量init完成之前,控制器正在調用getObject方法。

服務:

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]; 
    } 
    } 
}]); 

的配置:

.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; 
     } 
    } 
    }) 

回答

0

沙洛姆多爾!

選項1

做出承諾的鏈條,並返回只有在所有的承諾都解決了工廠。這將阻止控制器運行,因爲在解決所需的承諾之前,不會返回工廠依賴項。

選項2

創建服務某種初始化函數返回一個承諾(你可以使用$ Q)。在$ionicPlaform.ready()內部執行它,並在獲得承諾後才運行控制器邏輯。

在控制器:

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

在服務:

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