Как динамически выбирать репозиторий/сервис для использования в директиве/контроллере?

У меня есть директива, которая получает данные из базы данных, но я хочу, чтобы она использовала разные репозитории (с одним и тем же API) в разных местах проекта. Входящие данные имеют аналогичные поля, так что это не проблема. Есть ли способ передать это как параметр через тег директивы, например

<div my-directive="my-directive" service="Services.MovieService"></div>
<div my-directive="my-directive" service="Services.ActorService"></div>

или что было бы лучше всего, чтобы у меня не было кошмаров if/else и раздувания внедрения зависимостей с использованием строки, которая будет представлять имя службы?

Как это сделать для простых контроллеров?

Спасибо


person Michail Michailidis    schedule 29.10.2014    source источник


Ответы (1)


Службу можно динамически внедрить в контроллер директивы, используя $injector по ее имени. Возможность внедрять сервисы через аргументы контроллера — это просто удобство, которое предоставляет Angular. Под капотом $injector используется Angular для извлечения экземпляров объектов. Но мы также можем использовать $injector сами.

например, это ваша функция контроллера вашей директивы

  controller :($scope, $injector) {
  if(your_condition)
 { var ser= $injector.get(someService)  // someService contains the name of a service
  }

здесь ваше условие может быть любым условием, чтобы проверить, включать ли услугу или нет

person A.B    schedule 29.10.2014
comment
Это интересно, хотя я считаю, что это составит огромный список if-else, которых я хочу избежать. Что я мог бы сделать, так это передать условие $injector, и он предоставит мне правильный сервис. Но я думаю, даже при этом нет способа избежать «если-иначе», верно? - person Michail Michailidis; 30.10.2014
comment
да, вы можете, в конце вы должны передать имя службы в get() . да, но я думаю, что слишком много условий для внедрения службы будет противоречить декларативному подходу angular, вы не будете ожидать многого. это может быть только пара условий - person A.B; 30.10.2014
comment
Итак, что вы предлагаете, если, допустим, у меня есть десять сервисов? - person Michail Michailidis; 30.10.2014
comment
найдя этот точный ответ (stackoverflow.com/a/14418384/986160) на другой вопрос, я понял, что не не нужны никакие if/elses, и я могу передать имя службы непосредственно в $injector. Принятый! Спасибо - person Michail Michailidis; 30.10.2014