2016-02-26 63 views
0

让我们说,我们有以下指令:具有相同的指令多个后缀(angularjs)

app.directive('testList', function() { 
    return { 
     restrict: 'A', 
     link: function (scope, element, attrs) { 
      //do stuff 
     } 
    } 
}); 

我想打电话从多个元素这个指令在HTML

<button test-list-add></button> 
<table test-list="listObject"> 
    <tr ng-repeat="list in testList"> 
     <td test-list-click>list.item</td> 
    </tr> 
</table> 

是有可能为test-listtest-list-add,test-list,test-list-click)开头的每个属性进入link函数?

谢谢

+1

你可以尝试通过搜索属性,但什么是你想要做什么呢?你试图做的那种用法让我认为你应该看看transcluding。或者你应该在你的指令中指定一个模板,这样你就可以把所有的属性放在一个dom元素中,并生成你需要的模板 – Walfrat

+0

谢谢你的评论,我也认为我应该看看transcluding,但是因为我是新手角我想逐步做到。据我了解transcluding帮助我重新格式化html,但如果我有事件在那里,我也应该使用$ compile,不是吗? – IsraGab

+0

有两个使用transcluding,要么将ng-transclude放在您的模板中,要么在您的链接函数中调用它,如下所示:angular.element([ttransclude模板的元素])appendChild(transclude(scope。$ parent)) ;请注意,要具有作用域$ $ parent,您必须使用scope:true而不是隔离范围。对于事件部分,使用ng-click,ng-focus,ng-blur ......几乎包围所有本地事件,但是您可以在您的伪指令中注入$ compile并将其用于链接函数中,并在添加transcluded元素到结果。 – Walfrat

回答

0

你想通过属性的指令,并做一些动作,根据属性:

app.directive('testList', function() { 
    return { 
     restrict: 'A', 
     scope: { 
      'add': '@', // Text 
      'click': '&' // function 
     }, 
     link: function (scope, element, attrs) { 
      // scope.add - your Text you passed 
      // scope.click(); - calls your function you passed 
     } 
    } 
}); 

<button test-list add="test"></button> 
<table test-list="listObject"> 
    <tr ng-repeat="list in testList"> 
     <td test-list click="myFunc()">list.item</td> 
    </tr> 
</table> 

不能重复指令(你obvis试图做) 。

如果你想多后缀为一条指令,你必须通过一个声明它们一个:

app.directive('testListAdd', function() {...}); 
app.directive('testListclick', function() {...}); 

<test-list-add></test-list-add> 
<test-listclick></test-listclick>