2016-04-22 65 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; 
}; 
相关问题