在我的HomeController中,我从Web API服务加载数据,并且只有在加载数据后才导航到应用程序的默认状态(我正在使用ui-router)。我将数据(用户详细信息,设置等)存储在CacheService中,该CacheService被注入到需要访问它的任何其他控制器中 - 这意味着我只需要加载一次。
因此,一旦加载了数据,我就会使用$ state.go('/ diary')导航到应用程序的默认状态,并且DiaryController可以按预期访问CacheService中的数据。
但是,如果用户直接在浏览器中输入url(例如http://www.somedomain.com/diary),则首先执行DiaryController代码 - 这很糟糕,因为HomeController尚未将数据加载到CacheService中。
我的问题是如何在这种情况下强制AngularJS始终在任何其他控制器之前运行HomeController?
答案 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;}
};
}