从书签加载时AngularJS中的控制器加载顺序

时间:2014-05-09 14:03:46

标签: angularjs

在我的HomeController中,我从Web API服务加载数据,并且只有在加载数据后才导航到应用程序的默认状态(我正在使用ui-router)。我将数据(用户详细信息,设置等)存储在CacheService中,该CacheService被注入到需要访问它的任何其他控制器中 - 这意味着我只需要加载一次。

因此,一旦加载了数据,我就会使用$ state.go('/ diary')导航到应用程序的默认状态,并且DiaryController可以按预期访问CacheService中的数据。

但是,如果用户直接在浏览器中输入url(例如http://www.somedomain.com/diary),则首先执行DiaryController代码 - 这很糟糕,因为HomeController尚未将数据加载到CacheService中。

我的问题是如何在这种情况下强制AngularJS始终在任何其他控制器之前运行HomeController?

2 个答案:

答案 0 :(得分:0)

您必须查看resolve中的ui-router。这些是在启动控制器之前解析并注入控制器的对象映射。由于您很可能是从服务器异步加载数据,因此您必须使用返回promise的解析函数。

只有在解决了承诺后才会创建控制器。请参阅维基https://github.com/angular-ui/ui-router/wiki

上的resolve文档

答案 1 :(得分:0)

使用服务而不是控制器。沿着这些方向的东西


ng.factory ("dataService", function ($http, $q) {

  var infoDeferred = $q.defer();
  var infoPromise = infoDeferred.promise;

  // eagerly load the data
  $http.get("", {cache: true}).then(function (d) {
     infoDeferred.resolve(d)
  });

  return {
    // always return same promise
    getInfo: function () {return infoPromise;}
  };
}