【发布时间】:2016-02-25 20:40:14
【问题描述】:
AngularJS 1.5.0 带来了 $resolve 属性,旨在更轻松地将 ngRoute 解析数据传递到视图中,而无需为指令创建控制器。此属性也适用于常规视图。所以这行得通:
(function() {
function ConfigureRoutes($routeProvider) {
$routeProvider.
when('/test', {
templateUrl: 'test.html',
controller: 'TestController',
controllerAs: 'vm',
resolve: {
'stuff': ['$q', function($q) {
return $q.when([
{ id: 1, name: 'John' },
{ id: 2, name: 'Jake' }
]);
}]
});
}
app.config(['$routeProvider', ConfigureRoutes]);
})();
<pre>{{ $resolve.stuff | json }}</pre>
但是,有时我想将几个解析函数传递给控制器以在视图中使用之前进行变异。目前我在做类似的事情:
when('/test', {
...
resolve: {
'stuff_1': ...
'stuff_2': ...
}
});
app.controller('StuffController', ['stuff_1', 'stuff_2', function(stuff_1, stuff_2) {
this.stuff_1 = stuff_1;
this.stuff_2 = stuff_2;
}]);
有没有一种方法可以访问这个新的 $resolve 属性而不必单独访问参数?我试过了:
app.controller('StuffController', ['$scope', function($scope) {
this.stuff_1 = $scope.$resolve.stuff_1; // $scope.$resolve == undefined
}]);
app.controller('StuffController', ['$resolve', function($resolve) {
this.stuff_1 = $resolve.stuff_1; // injector error
}]);
编辑:
对于将来可能会发现这一点的人,您可以在控制器中以不同的方式访问此 $resolve 对象:
app.controller('TestController', function($route) {
this.$resolve = $route.current.locals;
});
因此决定在控制器实例化之前不附加$resolve。
还决定不制作$resolve 和可注射。这可以使用 $q.all() 作为单个解析函数来实现,如下所示:
function config($routeProvider) {
$routeProvider.when('/',
controller: 'TestController',
controllerAs: 'vm',
template: 'test.html',
resolve: {
$resolve: function($q) {
return $q.all({
local_1: $q.when(),
local_2: $q.when()
});
}
});
}
或者,如果您想要一个分叉版本,请参阅 PR ($scope.$resolve 在控制器之前)[https://github.com/angular/angular.js/pull/14135]
($resolve 为可注入) [https://github.com/angular/angular.js/pull/14136]
【问题讨论】: