您可以通过resolve
在您的 routingProvider 中使用来完成此操作。
这允许您在启动控制器之前等待一些承诺得到解决。
从文档中引用:
resolve - {Object.=} - 一个可选的依赖关系映射,应该注入到控制器中。如果这些依赖项中的任何一个是承诺,路由器将等待它们全部被解决或在控制器被实例化之前被拒绝。如果所有的 Promise 都成功解决,则注入已解决的 Promise 的值并触发 $routeChangeSuccess 事件。
简单的例子
app.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/', {templateUrl: 'home.html', controller: 'MyCtrl',resolve: {
myVar: function($q,$http){
var deffered = $q.defer();
// make your http request here and resolve its promise
$http.get('http://example.com/foobar')
.then(function(result){
deffered.resolve(result);
})
return deffered.promise;
}
}}).
otherwise({redirectTo: '/'});
}]);
然后 myVar 将被注入到您的控制器中,其中包含承诺数据。
避免额外的 DI 参数
您还可以通过返回您将要注入的服务来避免额外的 DI 参数:
app.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/', {templateUrl: 'home.html', controller: 'MyCtrl',resolve: {
myService: function($q,$http,myService){
var deffered = $q.defer();
/* make your http request here
* then, resolve the deffered's promise with your service.
*/
deffered.resolve(myService),
return deffered.promise;
}
}}).
otherwise({redirectTo: '/'});
}]);
显然,在执行此类操作时,您必须将请求的结果存储在共享服务的任何位置。
看看Angular Docs / routeProvider
我从egghead.io的那个人那里学到了大部分东西