2012-05-05 16 views
70

¿Cómo representaría una lista de definición dinámica usando AngularJS?¿Cómo representaría una lista de definición dinámica usando AngularJS?

Ejemplo:

datos:

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

HTML deseado:

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

El ejemplo de la http://docs.angularjs.org/tutorial/step_08:

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

obras para una serie dinámica de DDS y una nu estático mber de dts, pero no un número dinámico de ambos.

Respuesta

99

Una nueva característica que permite ng-repeat-start/ng-repetir-end se añadió en angular 1.2.

Con esta función, se puede escribir el código HTML siguiente manera:

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

Ver this plnkr para un ejemplo de trabajo completa.

+0

¿Has intentado utilizar esta función?Obtuve el error: 'TypeError: Object # no tiene el método 'hasAttribute'' –

+2

@gevgeny Parece que hay un error en el que no puede haber ningún texto (incluido el espacio en blanco) entre ng-repeat-start y ng-repeat-end. Este plunker funciona: http://plnkr.co/edit/9BhyYhQlQMRZtZKIsZ8G –

+0

Parece que tienes razón. Gracias. –

7

Este es un problema, porque hay que envolverlo con algún elemento con el fin de hacer repetir. Y eso no va a ser un HTML válido - se podrían obtener en el mismo problema con las listas o tablas desordenadas ...

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

supongo que la div dentro dl no está permitido por la especificación, pero funciona - al menos en cromo: -D

Tenemos la intención de apoyar ng-repeat dentro de un comentario para apoyar esto.

+2

que estoy aceptando su respuesta no porque su solución realmente funciona (consulte, por ejemplo, http://jsfiddle.net/JyWdT, que no funciona al menos en Chrome (todos los elementos deben ser de color)), pero debido a que usted es un desarrollador angular que dice que es imposible, y Por lo tanto, asumiré que es imposible. –

+0

demostración Ligeramente más elegante: http://jsfiddle.net/MaxNanasy/nEDyk –

+0

El problema es que el HTML no permite que envuelva estos elementos - no hay ningún elemento que permitió. Es por eso que nuestro compilador ya admite directivas en los comentarios, por lo que podemos permitir ng-repeat definida en un comentario en el futuro ... – Vojta

9

He creado una directiva llamada repeatInside para resolver problemas como éste.

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

Agradable y simple, me gustó esto mejor que las directivas oficiales sugeridas de "inicio"/"fin". – EventHorizon

+0

Funciona muy bien en angular <1.2 – MANCHUCK

+0

No he trabajado en esto por años, voy a echar un vistazo esta tarde (GMT + 1) – bigblind

3

Esta respuesta no parece funcionar para mí en v1.2.7 angular, así que quería publicar una ligera variación que funcionó bien para mí:

<dl> 
    <dt ng-repeat-start="(key, value) in items">{{key}}</dt> 
    <dd ng-repeat-end>{{value}}</dd> 
</dl> 
+0

Parece que 'items' es un objeto, no una matriz de objetos ... – PhiLho

Cuestiones relacionadas