AngularJS。将服务作为指令的论据

时间:2013-11-17 16:59:29

标签: angularjs

我有自己的指令:<form-wrapper>

现在这个指令使用自己的内部控制器,它使用一些ServiceUser服务)

像这样:

 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) {名称'User'导致注入用户服务时,因为这就是IoC在这里工作的方式。它知道这是一项服务。但如果我这样做了:

<form-wrapper service="User"> //这就是我想要的。

然后,“用户”将只是一个字符串,而不是对用户服务的引用。

2 个答案:

答案 0 :(得分:18)

您可以使用angular's $injector service在控制器中为字符串注入服务。

在HTML中:

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

在指令定义中:

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

答案 1 :(得分:4)

另一种方法是使用控制器注入。$ inject,传递一个数组。

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

function formWrapper() { 

    return { 
      ... 
     controller: formWrapperController,

 }
}

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

function formWrapperController(dataservice, $http) { }