加载控制器

时间:2016-04-22 14:46:39

标签: ionic-framework

我的服务有参数的异步init,我希望每个控制器都等到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;
      }
    }
  })

1 个答案:

答案 0 :(得分:0)

Shalom Dor!

选项1

制定一系列承诺并在所有承诺得到解决后返回工厂。这将阻止控制器运行,因为在解决了所需的promise之前,不会返回工厂依赖关系。

选项2

在您的服务中创建一个返回promise的排序初始化函数(您可以使用$ 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;
};