在投票之前,是的,这个问题已经在这里提出并回答,但答案并不令人满意。他们都正确地建议在路由配置中添加控制器,但这不是这种情况。
routeProvider的resolve
对象xxx
的预期行为将被注入控制器:
var app = angular.module('X', [])
.config(['$routeProvider', function ($routeProvider) {
$routeProvider.when('/',{
controller:'XCtrl',
templateUrl: 'x.html',
resolve: {
xxx: function () {
return 'XXX from routing config.';
}
}
})
}])
.controller('XCtrl', function($scope, xxx) {
console.log('xxx = '+xxx);
});
控制台应该获得xxx = XXX from routing config.
条目。
相反,上面的代码提取失败了:
Error: [$injector:unpr] Unknown provider: xxxProvider <- xxx
http://errors.angularjs.org/1.2.10/$injector/unpr?p0=xxxProvider%20%3C-%20xxx
.. etc.
XCtrl
未在HTML中使用ng-controller
指令声明,但仅在路由配置中定义。
答案 0 :(得分:3)
如果使用同一个控制器在路由配置中有多个条目,则在控制器中注入的所有属性都必须出现在resolve
对象的所有实例中:
var app = angular.module('X', [])
.config(['$routeProvider', function ($routeProvider) {
$routeProvider
.when('/',{
controller:'XCtrl',
templateUrl: 'x.html',
resolve: {
xxx: function () {
return 'XXX from routing config.';
}
another: // ...
}
})
.when('/page2',{
controller:'XCtrl',
templateUrl: 'x/p2.html',
resolve: {
xxx: function () {
return 'XXX from routing config.';
}
}
})
}])
.controller('XCtrl', function($scope, xxx) {
console.log('xxx = '+xxx);
});
resolve
个对象不一定是promises,从上面的函数返回的直接数据也可以。如果其中一个被拒绝,则Promise可以防止路由。