AngularJS. Передача услуг в качестве аргумента для директивы

У меня есть моя собственная директива: <form-wrapper>

В настоящее время в этой директиве используется собственный внутренний контроллер, который использует службу Service (User)

Вот так:

 directives.directive("formWrapper", ['User',  function(User) {
        return {
         ...        
         controller: function($scope, $location, User) {

                    $scope.fields = User.get( {id: "1"}  );              // GET
        ...

Как вы можете видеть: я использую жестко закодированную службу (User).

Вопрос: Как передать Сервис в качестве аргумента в Директиву? Чтобы использовать его так:

  Service = comesFromArgument
  $scope.fields = Service.get( {id: "1"} )

Я предполагаю, что если передать имя службы как строку (как имя службы), это не поможет. И прохождение аргумента обычно происходит в link-function, но не в контроллере.

ОБНОВЛЕНИЕ (больше объяснений):

При использовании directives.directive("formWrapper", ['User', function(User) { имя "Пользователь" приведет к использованию службы пользователя, потому что это так, как я полагаю, работает IoC. Он знает, что это услуга. Но если бы я сделал:

<form-wrapper service="User"> //это то, что я хочу.

Затем "Пользователь" будет просто строкой, а не ссылкой на службу пользователя.

Ответ 1

Вы можете использовать angular $injector службу, чтобы ввести службу, указанную в вашем контроллере.

В HTML:

<form-wrapper my-attr-with-service="User">
  ...
</form-wrapper>

В определении директивы:

controller: function ($scope, $element, $attrs, $injector) {
    var myService = $injector.get($attrs.myAttrWithService);
    // ...
}

Ответ 2

Другим способом является использование инъекции с использованием контроллера. $injection, передача массива.

app.module('widgets').directive('formWrapper', formWrapper);

function formWrapper() { 

    return { 
      ... 
     controller: formWrapperController,

 }
}

formWrapperController.$inject = ['dataservice', '$http']

function formWrapperController(dataservice, $http) { }