【发布时间】:2016-03-26 15:49:14
【问题描述】:
我试图弄清楚如何在创建我的最顶层控制器之前解决一个承诺。我正在使用 ui.router 所以我知道如何为我的不同路由解决控制器的承诺。但我不知道如何在我的第一个控制器加载之前解决它。
这是我的 index.html 的摘录:
<html lang="de" x-ng-app="myapp">
<body x-ng-controller="MainController">
...
<div id="header" x-ng-include="'top.html'"></div>
...
<div id="viewDiv" ui-view></div>
...
</body>
</html>
我想从服务器加载当前季节(以及其他很少更改的数据),并将其注入到我的 top.html 标头和一些视图控制器的控制器中。我有一项服务可以加载我当前的季节并返回一个承诺:
services.factory('RestAccess', function(Restangular) {
return {
loadCurrentSeason : loadCurrentSeason
};
function loadCurrentSeason() {
return Restangular.one('season','current').get();
}
});
而且我希望将此函数的 RESOLVED 承诺注入到我的 MainController 中:
controllers.controller('MainController', function($scope, currentSeason, SomeService) {
$scope.season = currentSeason;
$scope.stuff = SomeService.loadStuff(currentSeason);
});
我该如何配置呢? 这适用于负责 body-element 的 Controller。所以我这里还没有使用任何路由。
我想要类似的东西
resolve: {
currentSeason : function(RestAccess) {return RestAccess.loadCurrentSeason();}
}
但我不知道该放在哪里。
【问题讨论】:
-
为什么不等待你的承诺来解决和隐藏内容或用
ng-if = "currentSeason"或类似的东西做任何你想做的事情?loadCurrentSeason.then(function(currentSeason) {$scope.currentSeason = currentSeason; });你也可以有一个包装指令来等待承诺,然后通过在一些“init”方法中通过参数给它解析的值来调用控制器。 -
这不是隐藏内容。这是关于调用需要此参数的服务方法。如果它只是在少数控制器中,我会接受你的建议。但我需要在几十个控制器中使用这个值。
-
那么你可以让你的服务消耗承诺而不是价值,这就是承诺的想法:将它们作为常规值操作,并在你需要它们的值时注册
then。或者,如果这一季的内容非常具体,您甚至可以在启动应用程序之前先加载它,然后使用angular.bootstrap(...)启动编译 -
我的问题是我需要等待所有 3-4 个承诺才能继续。这会使代码变得非常复杂和不可读。我不知道 angular.bootstrap(...),我想这将是我在问这个问题时一直在寻找的直接答案。我决定走另一条路,将我的 MainController 包含到我的 ui.router 状态中。
-
那么实际上你想在top.html上先加载初始化一些静态数据,然后再为不同的控制器重用?
标签: javascript angularjs angular-promise