По какой-то причине динамическое внедрение определенной фабрики на основе параметра маршрута не удается

0

Я хочу динамически вводить завод в свой угловой контроллер на основе параметра маршрута. Это моя конфигурация маршрута:

$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.

  • 0
    Можете ли вы опубликовать остальную часть вашего блока конфигурации, пожалуйста?
Теги:
dependency-injection
angularjs-routing

1 ответ

1
Лучший ответ

Вы, очевидно, используете $injector который был введен в блок config, и он отличается от $injector который вводится куда угодно. Первый действует на поставщиков услуг, последний действует на экземплярах службы.

Должен быть

    "factory": function r($route, $injector) {
        return $injector.get($route.current.params.table + "Factory");
    }
  • 0
    Вау, это помогло! Не знал этого. Большое спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню