由于某种原因,基于路由参数动态注入特定工厂失败

时间:2015-10-06 21:43:03

标签: javascript angularjs dependency-injection angularjs-routing

我想基于路由参数动态地将工厂注入我的Angular控制器。这是我的路线配置:

$routeProvider
.when("/tables/:table",
{
    controller: "tableController",
    templateUrl: "/app/views/table.html",
    resolve: {
        "factory": function r($route) {
            return $injector.get($route.current.params.table + "Factory"); // Error!
        }
    }
})

例如,当路线为tables/employee时,我希望将employeeFactory注入tableController,依此类推。

很遗憾,此配置不起作用 - 我在r函数中收到Unknown provider: employeeFactory错误。

另一方面,我可以将$injector服务直接传递给tableController,并在那里成功解决employeeFactory

(function (angular) {
    var tableController = function ($routeParams, $injector) {
        // employeeFactory resolves successfully here!
        var factory = $injector.get($routeParams.table + "Factory");
    };

    angular.module("appModule").controller("tableController", tableController);
})(angular);

但是,我不喜欢这种方法,因为它遵循service locator anti-pattern。我真的希望factory使用路由配置注入,而不是这个丑陋的解决方法。

那么,为什么Angular在$injector.get()使用resolve时会抛出错误,但是成功解析了tableController内的工厂?我正在使用Angular 1.4.4。

1 个答案:

答案 0 :(得分:1)

您显然使用注入$injector块的config,它与注入其他任何位置的$injector不同。前acts on service providers,后者acts on service instances

应该是

    "factory": function r($route, $injector) {
        return $injector.get($route.current.params.table + "Factory");
    }