2012-05-05 2 views
70

Come eseguire il rendering di un elenco di definizioni dinamiche utilizzando AngularJS?Come eseguo il rendering di un elenco di definizioni dinamiche utilizzando AngularJS?

Esempio:

dati:

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

HTML desiderata:

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

L'esempio a http://docs.angularjs.org/tutorial/step_08:

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

lavori per una serie dinamica di DDS e un statico mber di dts, ma non un numero dinamico di entrambi.

risposta

99

Una nuova funzione che consente ng-repeat-start/ng-repeat-end è stata aggiunta in Angular 1.2.

Con questa funzione, è possibile scrivere il codice HTML in questo modo:

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

Vedi this plnkr per un esempio di lavoro completo.

+0

Hai provato a utilizzare questa funzione?Ho ricevuto l'errore: 'TypeError: Object # non ha alcun metodo 'hasAttribute'' –

+2

@gevgeny sembra che ci sia un bug in cui non puoi avere testo (inclusi spazi bianchi) tra ng-repeat-start e ng-repeat-end. Questo plunker funziona: http://plnkr.co/edit/9BhyYhQlQMRZtZKIsZ8G –

+0

Sembra che tu abbia ragione. Grazie. –

7

Questo è un problema, perché è necessario avvolgerlo con qualche elemento per poterlo ripetere. E non sta andando essere una valida html - si otterrebbe nella stessa difficoltà con le liste non ordinate o tabelle ...

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

Credo che la div all'interno dl non è consentito dalla spec, ma funziona - almeno in Chrome :-D

Abbiamo intenzione di supportare ng-repeat all'interno di un commento per supportare questo.

+2

Sono accettare la tua risposta non perché il tuo workaround funziona davvero (vedi ad esempio http://jsfiddle.net/JyWdT, che non funziona completamente almeno in Chrome (tutti gli elementi dovrebbero essere colorati)), ma perché sei uno sviluppatore Angolare che dice che è impossibile, e Quindi assumerò che sia impossibile. –

+0

Dimostrazione leggermente più appassionata: http://jsfiddle.net/MaxNanasy/nEDyk –

+0

Il problema è che html non ti permette di racchiudere questi elementi - non esiste un elemento consentito per quello. Ecco perché il nostro compilatore supporta già le direttive nei commenti, in modo che possiamo consentire ng-repeat definito in un commento in futuro ... – Vojta

9

Ho creato una direttiva chiamata repeatInside per risolvere problemi come questo.

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

Bello e semplice, mi è piaciuto molto meglio delle direttive "start"/"fine" suggerite. – EventHorizon

+0

Funziona perfettamente in angolare <1,2 – MANCHUCK

+0

Non ho lavorato su questo per anni, darò un'occhiata oggi pomeriggio (GMT + 1) – bigblind

3

Questa risposta non sembra funzionare per me in v1.2.7 angolare così ho voluto pubblicare una leggera variazione che ha funzionato bene per me:

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

Sembra che 'items' sia un oggetto, non un array di oggetti ... – PhiLho