我想基于路由参数动态地将工厂注入我的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。
答案 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");
}