如何使用AngularJS渲染动态定义列表?


71

如何使用AngularJS渲染动态定义列表?

例:

数据:

[
    {
        key: 'a',
        value: 'x'
    }, {
        key: 'b',
        value: 'y'
    }
]

所需的HTML:

<dl>
    <dt>a</dt>
    <dd>x</dd>
    <dt>b</dt>
    <dd>y</dd>
</dl>

http://docs.angularjs.org/tutorial/step_08上的示例:

<dl>
    <dt>Availability</dt>
    <dd ng-repeat="availability in phone.availability">{{availability}}</dd>
</dl>

适用于动态数的dds和静态数的dts,但不适用于两者的动态数。

Answers:


102

Angular 1.2中增加了一个新功能,允许ng-repeat-start / ng-repeat-end。

使用此功能,您可以像这样编写html:

<dl>
  <dt ng-repeat-start="i in items">{{i.key}}</dt>
  <dd ng-repeat-end>{{i.value}}</dd>
</dl>

有关完整的工作示例,请参见此plnkr


您是否尝试过使用此功能?我得到了错误:TypeError: Object #<Text> has no method 'hasAttribute'
尤金·格卢霍托连科

2
@gevgeny似乎存在一个错误,即您无法在ng-repeat-start和ng-repeat-end之间包含任何文本(包括空格)。这位pl客作品:plnkr.co/edit/9BhyYhQlQMRZtZKIsZ8G
AleksanderBlomskøld2013年

1
@gevgeny我已经对此问题提出了请求:github.com/angular/angular.js/pull/2859
AleksanderBlomskøld13年6

9

我创建了一个名为repeatInside的指令来解决此类问题。

<dl repeat-inside="word in dictionary">
    <dt>{{word.name}}</dt>
    <dd>{{word.definition}}</dd>
</dl>

1
很好,很简单,我比建议的官方“开始” /“结束”指令更好地喜欢它。
EventHorizo​​n 2013年

角度小于1.2时效果很好
MANCHUCK 2014年

我已经有很长一段时间没有对此进行研究了,今天下午(GMT + 1)
bigblind 2014年

该代码现在可以与最新版本的angular一起使用,而我只需要更新示例即可使用myApp.controller定义控制器。如果您有无法使用的用例,请告诉我。
bigblind 2014年

7

这是一个问题,因为您需要用一些元素包装它才能重复。那将不是有效的html-您将遇到无序列表或表格的麻烦...

<dl>
  <div ng-repeat="i in items">
    <dt>{{i.key}}</dt>
    <dd>{{i.value}}</dd>
  </div>
</dl>

我猜想div里面dl是规范所不允许的,但是它可以工作-至少在Chrome :-D中

我们计划ng-repeat在评论中提供支持。


2
我接受您的答案不是因为您的解决方法确实有效(请参阅例如jsfiddle.net/JyWdT,至少在Chrome中它不能完全正常工作(所有元素都应带有颜色)),而是因为您是说过它的Angular开发人员是不可能的,因此我将认为这是不可能的。
马克斯·纳纳西

问题是,html不允许您包装这些元素-没有为此允许的元素。这就是为什么我们的编译器已经支持注释中的指令,以便将来我们可以允许在注释中定义ng-repeat的原因……
Vojta,2012年

1
我在尝试渲染span每个集合项3个而不将它们包装在父级中时遇到了同样的问题。似乎这没有得到解决。是否对此有任何更新,或者其他解决方法?
德鲁·诺阿克斯

2
或像spry一样,您可以拥有一个名为ng-repeat-children的指令,该指令不使用定义指令的元素,而仅使用其子元素。
mpm 2012年

@DrewNoakes也许在stackoverflow.com/a/16808545/699700上找到答案,如果您ng-repeat-start使用第一个跨度和ng-repeat-end第三个跨度,则可能对您有用。
Max Nanasy

3

这个答案似乎在Angular v1.2.7中对我不起作用,因此我想发布一个对我来说很好的细微变化:

<dl>
    <dt ng-repeat-start="(key, value) in items">{{key}}</dt>
    <dd ng-repeat-end>{{value}}</dd>
</dl>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.