解析对象的属性未传递给控制器​​,未知提供程序错误

时间:2014-02-12 19:55:56

标签: angularjs angularjs-routing

在投票之前,是的,这个问题已经在这里提出并回答,但答案并不令人满意。他们都正确地建议在路由配置中添加控制器,但这不是这种情况。

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指令声明,但仅在路由配置中定义。

1 个答案:

答案 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可以防止路由。