Angularjs - 将参数传递给指令

时间:2014-10-16 16:31:48

标签: angularjs controller arguments directive

我想知道是否有办法将参数传递给指令?

我想要做的是从控制器附加一个指令,如下所示:

$scope.title = "title";
$scope.title2 = "title2";

angular.element(document.getElementById('wrapper')).append('<directive_name></directive_name>');

是否可以同时传递参数,以便我的指令模板的内容可以链接到一个或另一个范围?

这是指令:

app.directive("directive_name", function(){
    return {
        restrict:'E',
        transclude:true,
        template:'<div class="title"><h2>{{title}}</h3></div>',
        replace:true
    };
})

如果我想使用相同的指令,但使用$ scope.title2?

,该怎么办?

6 个答案:

答案 0 :(得分:133)

您可以像使用内置Angular指令一样将参数传递给自定义指令 - 通过在directive-element上指定属性:

angular.element(document.getElementById('wrapper'))
       .append('<directive-name title="title2"></directive-name>');

您需要做的是在指令的工厂函数中定义scope(包括参数/参数)。在下面的示例中,该指令采用title - 参数。然后,您可以使用常规的Angular-way在template中使用它:{{title}}

app.directive('directiveName', function(){
   return {
      restrict:'E',
      scope: {
         title: '@'
      },
      template:'<div class="title"><h2>{{title}}</h2></div>'
   };
});

根据您要绑定的方式/内容,您有不同的选择:

  • =是双向约束
  • @只是读取值(单向绑定)
  • &用于绑定函数

在某些情况下,您可能需要使用与“内部”名称不同的“外部”名称。对于外部,我的意思是指令元素上的属性名称,而内部是指在指令范围内使用的变量的名称。

例如,如果我们查看上面的指令,您可能不希望为标题指定另一个附加属性,即使您内部希望使用title - 属性。相反,您希望按如下方式使用您的指令:

<directive-name="title2"></directive-name>

这可以通过在范围定义中指定上述选项背后的名称来实现:

scope: {
    title: '@directiveName'
}

请注意以下事项:

  • HTML5规范说自定义属性(这基本上是Angular应用程序中的所有属性)应该以{{1​​}}为前缀。 Angular通过从任何属性中剥离data- - 前缀来支持此功能。因此,在上面的示例中,您可以在元素(data-)上指定属性,内部的所有内容都相同。
  • 元素的属性始终采用data-title="title2"的形式,而在代码中(例如范围对象的属性),它们的格式为<div data-my-attribute="..." />。在我意识到这一点之前,我失去了很多时间。
  • 对于在不同Angular组件(控制器,指令)之间交换/共享数据的另一种方法,您可能希望查看服务或指令控制器。
  • 您可以在Angular homepage (directives)
  • 上找到更多信息

答案 1 :(得分:7)

以下是我解决问题的方法:

<强>指令

app.directive("directive_name", function(){
    return {
        restrict: 'E',
        transclude: true,
        template: function(elem, attr){
           return '<div><h2>{{'+attr.scope+'}}</h2></div>';
        },
        replace: true
    };
})

<强>控制器

$scope.building = function(data){
    var chart = angular.element(document.createElement('directive_name'));
    chart.attr('scope', data);
    $compile(chart)($scope);
    angular.element(document.getElementById('wrapper')).append(chart);
  }

我现在可以通过同一个指令使用不同的范围并动态附加它们。

答案 2 :(得分:6)

您可以尝试如下:

app.directive("directive_name", function(){
return {
    restrict:'E',
    transclude:true,
    template:'<div class="title"><h2>{{title}}</h3></div>',
    scope:{
      accept:"="
    },
    replace:true
  };
})

它设置了'accept'属性值与父范围之间的双向绑定。

您还可以使用属性设置双向数据绑定:'='

例如,如果您希望键和值都绑定到本地范围,则可以执行以下操作:

  scope:{
    key:'=',
    value:'='
  },

欲了解更多信息, https://docs.angularjs.org/guide/directive

因此,如果你想将一个参数从控制器传递给指令,那么请参考下面的小提琴

http://jsfiddle.net/jaimem/y85Ft/7/

希望有所帮助......

答案 3 :(得分:1)

控制器代码

myApp.controller('mainController', ['$scope', '$log', function($scope, $log) {
    $scope.person = {
        name:"sangeetha PH",
       address:"first Block"
    }
}]);

指令代码

myApp.directive('searchResult',function(){
   return{
       restrict:'AECM',
       templateUrl:'directives/search.html',
       replace: true,
       scope:{
           personName:"@",
           personAddress:"@"
       }
   } 
});

用法

文件:directives / search.html
内容:

<h1>{{personName}} </h1>
<h2>{{personAddress}}</h2>

我们在其中使用指令的文件

<search-result person-name="{{person.name}}" person-address="{{person.address}}"></search-result>

答案 4 :(得分:0)

<button my-directive="push">Push to Go</button>

app.directive("myDirective", function() {
    return {
        restrict : "A",
         link: function(scope, elm, attrs) {
                elm.bind('click', function(event) {

                    alert("You pressed button: " + event.target.getAttribute('my-directive'));
                });
        }
    };
});

这是我做的事情

我正在使用指令作为html属性,我在HTML文件中传递了以下参数。 my-directive="push"从指令中我从Mouse-click事件对象中检索它。 event.target.getAttribute('my-directive')

答案 5 :(得分:0)

根据您的控制器对其中ng-confirm-click中显示的变量所做的更改,在具有范围的$ click事件中插入var msg。$ apply对确认进行更改。

<button type="button" class="btn" ng-confirm-click="You are about to send {{quantity}} of {{thing}} selected? Confirm with OK" confirmed-click="youraction(id)" aria-describedby="passwordHelpBlock">Send</button>




app.directive('ngConfirmClick', [
  function() {
    return {
      link: function(scope, element, attr) {
        var clickAction = attr.confirmedClick;
        element.on('click', function(event) {
          var msg = attr.ngConfirmClick || "Are you sure? Click OK to confirm.";
          if (window.confirm(msg)) {
            scope.$apply(clickAction)
          }
        });
      }
    };
  }
])