由于某种原因,基于路由参数动态注入特定工厂失败
Dynamically injecting a specific factory based on route parameter fails for some reason
我想根据路由参数将工厂动态注入到我的 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
,我想在tableController
中注入一个employeeFactory
,以此类推。
不幸的是,此配置不起作用 — 我在 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.
您显然使用了注入到 config
块中的 $injector
,它与注入到其他任何地方的 $injector
不同。前者acts on service providers, the latter acts on service instances.
应该是
"factory": function r($route, $injector) {
return $injector.get($route.current.params.table + "Factory");
}
我想根据路由参数将工厂动态注入到我的 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
,我想在tableController
中注入一个employeeFactory
,以此类推。
不幸的是,此配置不起作用 — 我在 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.
您显然使用了注入到 config
块中的 $injector
,它与注入到其他任何地方的 $injector
不同。前者acts on service providers, the latter acts on service instances.
应该是
"factory": function r($route, $injector) {
return $injector.get($route.current.params.table + "Factory");
}