2012-05-05 43 views
70

Jak mogę renderować dynamiczną listę definicji przy użyciu AngularJS?Jak mogę wyświetlić dynamiczną listę definicji przy użyciu AngularJS?

Przykład:

danych:

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

Pożądany HTML:

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

Przykładem na http://docs.angularjs.org/tutorial/step_08:

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

prace dla wielu dynamicznych DDS oraz static nu mber of dts, ale nie liczba dynamiczna obu.

Odpowiedz

99

Dodano nową cechę, która umożliwia ng-repeat-start/ng-repeat-end w Angular 1.2.

Dzięki tej funkcji można napisać html tak:

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

Zobacz this plnkr dla pełnego przykład roboczego.

+0

Czy próbowałeś korzystać z tej funkcji?Wystąpił błąd: 'TypeError: Object # nie ma metody 'hasAttribute'' –

+2

@gevgeny wydaje się, że istnieje błąd, w którym nie można mieć żadnego tekstu (w tym białych znaków) między ng-repeat-start i ng-repeat-end. Ten plunker działa: http://plnkr.co/edit/9BhyYhQlQMRZtZKIsZ8G –

+0

Wygląda na to, że masz rację. Dziękuję Ci. –

7

Jest to problem, ponieważ trzeba owinąć go jakimś elementem, aby powtórzyć. I to nie będzie prawidłowy html - co można uzyskać w tym samym kłopoty z nieuporządkowanych list lub tabel ...

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

Chyba div wewnątrz dl nie jest dozwolone przez specyfikację, ale działa - przynajmniej w Chrome :-D

Planujemy wesprzeć ng-repeat wewnątrz komentarza, aby to wspierać.

+2

jestem akceptując swoją odpowiedź, ponieważ nie Twoje obejście działa (zobacz np. http://jsfiddle.net/JyWdT, który nie działa w pełni w Chrome przynajmniej w kolorze (wszystkie elementy powinny być kolorowe), ale ponieważ jesteś programistą Angular, który twierdzi, że jest to niemożliwe, i Dlatego zakładam, że to niemożliwe. –

+0

Nieco bardziej wyszukana demonstracja: http://jsfiddle.net/MaxNanasy/nEDyk –

+0

Problem polega na tym, że html nie pozwala na zawijanie tych elementów - nie ma na to dozwolonego elementu. Dlatego nasz kompilator już obsługuje dyrektywy w komentarzach, abyśmy mogli zezwolić na powtórzenie ng zdefiniowane w komentarzu w przyszłości ... – Vojta

9

Utworzono dyrektywę o nazwie repeatInside w celu rozwiązania problemów takich jak ten.

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

Miło i prosto, podobało mi się to lepiej niż sugerowane oficjalne dyrektywy "początek"/"koniec". – EventHorizon

+0

Działa świetnie pod kątem <1.2 – MANCHUCK

+0

Nie pracowałem nad tym od wieków, przyjrzę się dziś po południu (GMT + 1) – bigblind

3

Ta odpowiedź nie wydaje się pracować dla mnie w Kątowymi v1.2.7 więc chciałem zakładać lekką odmianę, który pracował dobrze dla mnie:

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

Wygląda, że ​​'items' to obiekt, a nie tablica obiektów ... – PhiLho

Powiązane problemy