指令模板元素的唯一ID

我有一个可以在页面上多次使用的指令。 在这个指令的模板中,我需要使用ID作为input-Element,这样我就可以像这样“绑定”Label:

<input type="checkbox" id="item1" /><label for="item1">open</label> 

现在的问题是,只要我的指令被包含多次,ID“item1”不再是唯一的,标签不能正常工作(点击时应该选中/取消选中checkbox)。

这个问题是如何解决的? 有没有办法给模板分配一个“命名空间”或“前缀”(如asp.net与ctl00 …-前缀)? 还是必须在每个id-Attribute中包含一个angular度expression式,该angular色由来自Scope +静态ID的指令ID组成。 就像是:

 <input type="checkbox" id="{{directiveID}} + 'item1'" /><label for="{{directiveID}} + 'item1'">open</label> 

编辑:

我的指令

 module.directive('myDirective', function () { return { restrict: 'E', scope: true, templateUrl: 'partials/_myDirective.html', controller: ['$scope', '$element', '$attrs', function ($scope, $element, $attrs) { ... } //controller }; }]); 

我的HTML

 <div class="myDirective"> <input type="checkbox" id="item1" /><label for="item1">open</label> </div> 

HTML

  <div class="myDirective"> <input type="checkbox" id="myItem_{{$id}}" /> <label for="myItem_{{$id}}">open myItem_{{$id}}</label> </div> 

UPDATE

Angular 1.3引入了本地惰性一次性绑定。 从angular度expression文档 :

一次性绑定

以::开始的expression式被认为是一次性expression式。 一次性expression式一旦稳定就会停止重新计算,如果expression式结果是一个非未定义的值(见下面的值稳定algorithm),则会在第一个摘要之后发生。

原生解决scheme

 .directive('myDirective', function() { var uniqueId = 1; return { restrict: 'E', scope: true, template: '<input type="checkbox" id="{{::uniqueId}}"/>' + '<label for="{{::uniqueId}}">open</label>', link: function(scope, elem, attrs) { scope.uniqueId = 'item' + uniqueId++; } } }) 

只绑定一次:

  • 如果你只需要绑定一个值,那么你不应该使用绑定({{}} / ng-bind)
  • 绑定是昂贵的,因为他们使用$ watch。 在你的例子中,在每一个消息摘要中,有angular度的脏检查你的ID的变化,但你只设置一次。
  • 检查这个模块: https : //github.com/Pasvaz/bindonce

解:

 .directive('myDirective', function() { var uniqueId = 1; return { restrict: 'E', scope: true, template: '<input type="checkbox"/><label>open</label>', link: function(scope, elem, attrs) { var item = 'item' + uniqueId++; elem.find('input').attr('id' , item); elem.find('label').attr('for', item); } } }) 

我们在范围中添加一个BlockId参数,因为我们在我们的Seleniumtesting中使用了id。 还有一个机会,他们不是独一无二的,但我们宁愿完全控制他们。 另一个好处是,我们可以给这个项目一个更具描述性的ID。

指令JS

 module.directive('myDirective', function () { return { restrict: 'E', scope: { blockId: '@' }, templateUrl: 'partials/_myDirective.html', controller: ['$scope', '$element', '$attrs', function ($scope, $element, $attrs) { ... } //controller }; }]); 

指令HTML

 <div class="myDirective"> <input type="checkbox" id="{{::blockId}}_item1" /><label for="{{::blockId}}_item1">open</label> </div> 

用法

 <my-directive block-id="descriptiveName"></my-directive> 

除了Ilan和BuriB的解决scheme(这是更通用的,这是很好的),我find了解决我的具体问题,因为我需要标签的“for”属性的ID。 而是可以使用下面的代码:

 <label><input type="checkbox"/>open</label> 

下面的Stackoverflow-Post帮助了:

https://stackoverflow.com/a/14729165/1288552