Я хочу динамически вводить завод в свой угловой контроллер на основе параметра маршрута. Это моя конфигурация маршрута:
$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
и т.д.
К сожалению, эта конфигурация не работает - я получаю сообщение Unknown provider: employeeFactory
в функции r
.
С другой стороны, я могу вместо этого передать службу $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);
Тем не менее, мне не нравится этот подход, потому что он следует анти-шаблону локатора сервисов. Мне бы очень хотелось, чтобы factory
была введена с использованием конфигурации маршрутизации, а не это уродливое обходное решение.
Итак, почему Angular выдает ошибку при использовании $injector.get()
с resolve
, но успешно разрешает фабрику внутри tableController
? Я использую Angular 1.4.4.
Вы, очевидно, используете $injector
который был введен в блок config
, и он отличается от $injector
который вводится куда угодно. Первый действует на поставщиков услуг, последний действует на экземплярах службы.
Должен быть
"factory": function r($route, $injector) {
return $injector.get($route.current.params.table + "Factory");
}