2013-03-08 40 views
38

我想在我的ng重复中为我的div设置一个动态标识。让我举一个例子。动态标识重复

<div id="$index" ng-repeat="repeat in results.myJsonResults"> 
    <div id="$index" ng-click="saveID($index)" ng-repeat="subRepeat in results.myJsonResults.subresults"> 
</div> 

我的问题是,当我点击我的孩子的div,我想我的父母ID名称,但看起来像的角度不正确设置ID到div。在这个概念中可以设置一个动态ID吗? PS:我过去在我的控制器上创建了一个计数器方法并设置了一个索引,但事实证明,角度只能识别这个ID的最后一个值。

+0

您不能重复ID页面,你在做什么。为什么你甚至需要一个ID? – charlietfl 2013-03-09 02:59:14

回答

61

要回答你的问题,试试这个:

<div id="{{$index}}" ...> 

虽然上面应该工作,这可能是不是你想要的真的是(!)。请注意,AngularJS通过引用id来操纵元素是非常罕见的。

您应该专注于您的模型,声明性描述UI,并让AngularJS做“其余”,而不需要“手动”进行低级DOM操作。

+0

你有没有一个很好的例子,以良好的方式相同的行为? – marceloduende 2013-03-08 19:45:53

+0

@marceloduende你必须首先解释你在做什么,从功能上来说......一个工作中的人群将是理想的。 – 2013-03-08 19:49:23

+0

同意。需要在转发器中设置一个id绝对是一种代码味道。我会假设你会出于某种原因使用jquery,如果这是正确的,那么你应该为' – 2013-03-08 20:41:30

26

用例我能想到的是关联<label>元素各自的<input>元素,如http://jsfiddle.net/YqUAp/

应用见过有a pkozlowski.opensource的方法

<label for="{{ 'textField-' + $index }}">Option {{ $index }}</label> 
<input type="text" id="{{ 'textField-' + $index }}" ng-model="field"/> 

虽然我不能确定这是否是最有效的方法。 (哪怕只是可读性)

+0

对于我来说,这似乎并不工作(特别是对于选择具有ng-options的元素)1.2rc3 – 2013-10-29 20:50:55

+2

https://github.com/angular/angular.js/issues/4511 – 2013-10-29 21:30:30

+0

我这样做是出于同样的原因。 2014-11-08 15:37:10

4
<div id="{{$index}}" ...> 

效果很好,但你也可以把一个动态的ID反复场如果 - 例如 - subRepeat将有一个ID字段。 这将是:

<div id="subRepeat{{subRepeat.id}}" ...> 

这将让像subRepeat1,subRepeat2,... IDS对你重复DIV

0

你需要保持索引你的对象

results = { myJsonResults : [ 
    { name: "abc", id: 1, subResults: [ 
           { subName: "123", id: 1 }, 
           { subName: "456", id: 2 }] } 
    { name: "xyz", id: 2, subResults: [ 
           { subName: "789", id: 1 }, 
           { subName: "098", id: 2 }] } 
          ] }; 

而且你重复是指结果,它将它们断开连接,取而代之的是使用thisResult:

<div id="thisResult.id" ng-repeat="thisResult in results.myJsonResults"> 
    {{ thisResult.name }} 
    <div id="subResult.id" ng-click="saveID(subResult.id)" ng-repeat="subResult in thisResult.subResults"> {{ subResult.subName }} </div> 
</div>