Muszę użyć ng-repeat
(w AngularJS), aby wyświetlić wszystkie elementy w tablicy.
Trudność polega na tym, że każdy element tablicy przekształci się w jeden, dwa lub trzy wiersze tabeli.
Nie mogę utworzyć prawidłowego kodu HTML, jeśli ng-repeat
jest używany w elemencie, ponieważ żaden typ powtarzającego się elementu nie jest dozwolony między <tbody>
a <tr>
.
Na przykład, gdybym użył ng-repeat on <span>
, dostałbym:
<table>
<tbody>
<span>
<tr>...</tr>
</span>
<span>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
</span>
<span>
<tr>...</tr>
<tr>...</tr>
</span>
</tbody>
</table>
Który jest nieprawidłowym html.
Ale to, czego potrzebuję, to:
<table>
<tbody>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
<tr>...</tr>
</tbody>
</table>
gdzie pierwszy wiersz został wygenerowany przez pierwszy element tablicy, następne trzy przez drugi, a piąty i szósty przez ostatni element tablicy.
Jak mogę użyć ng-repeat w taki sposób, aby element html, z którym jest powiązany, „znikał” podczas renderowania?
Czy jest na to inne rozwiązanie?
Wyjaśnienie: Wygenerowana struktura powinna wyglądać jak poniżej. Każdy element tablicy może generować 1-3 wiersze tabeli. W idealnym przypadku odpowiedź powinna obsługiwać od 0 do n wierszy na element tablicy.
<table>
<tbody>
<!-- array element 0 -->
<tr>
<td>One row item</td>
</tr>
<!-- array element 1 -->
<tr>
<td>Three row item</td>
</tr>
<tr>
<td>Some product details</td>
</tr>
<tr>
<td>Customer ratings</td>
</tr>
<!-- array element 2 -->
<tr>
<td>Two row item</td>
</tr>
<tr>
<td>Full description</td>
</tr>
</tbody>
</table>
tr
, dostałbym jeden wiersz na element tablicy, o ile rozumiem.tr
które są generowane przez jeden element tablicy, nie mają takiej samej struktury.Odpowiedzi:
Aktualizacja: jeśli używasz Angular 1.2+, użyj ng-repeat-start . Zobacz odpowiedź @ jmagnusson.
W przeciwnym razie, co powiesz na umieszczenie powtórzenia ng na ciele? (AFAIK, dobrze jest mieć wiele elementów <tbody> w jednej tabeli).
źródło
Od AngularJS 1.2 istnieje dyrektywa o nazwie,
ng-repeat-start
która robi dokładnie to, o co prosisz. Zobacz moją odpowiedź na to pytanie, aby zapoznać się z opisem, jak go używać.źródło
Jeśli używasz ng> 1.2, oto przykład użycia
ng-repeat-start/end
bez generowania niepotrzebnych tagów:Ważna kwestia: w przypadku tagów używanych
ng-repeat-start
ing-repeat-end
ustawianychng-if="0"
, nie wolno ich wstawiać na stronę. W ten sposób zawartość wewnętrzna będzie obsługiwana dokładnie tak, jak w knockoutjs (przy użyciu poleceń w<!--...-->
) i nie będzie żadnych śmieci.źródło
Możesz chcieć spłaszczyć dane w swoim kontrolerze:
A potem w HTML:
źródło
ng-repeat-start
,ng-repeat-end
Złamać mój projekt, więc rozwiązaniem było stworzenie dodatkowej zmiennej dodanie tego obiektu separatora przed każdym elemencie i iteracyjne nowy var:<div class="c477_group"> <div class="c477_group_item" ng-repeat="item in itemsWithSeparator" ng-switch="item.id" ng-class="{'-divider' : item.id == 'SEPARATOR'}"> <div class="c478" ng-switch-when="FAS"/> <div class="c478" ng-switch-when="SEPARATOR" /> <div class="c479" ng-switch-default /> </div> </div>
Powyższe jest poprawne, ale aby uzyskać bardziej ogólną odpowiedź, nie wystarczy. Musiałem zagnieżdżać ng-repeat, ale pozostać na tym samym poziomie html, czyli pisać elementy w tym samym rodzicu. Tablica tagów zawiera znaczniki, które również mają tablicę tagów. W rzeczywistości jest to drzewo.
Oto co w końcu zrobiłem.
Zwróć uwagę na ng-if = "false", które ukrywa początkowe i końcowe elementy div.
Powinien się wydrukować
nazwa1, nazwa1_1, nazwa1_2, nazwa2, nazwa2_1, nazwa2_2,
źródło
Chciałbym tylko skomentować, ale wciąż brakuje mojej reputacji. Więc dodaję inne rozwiązanie, które również rozwiązuje problem. Naprawdę chciałbym obalić stwierdzenie @bmoeskau, że rozwiązanie tego problemu wymaga co najwyżej hakerskiego rozwiązania, a ponieważ pojawiło się to niedawno w dyskusji, mimo że ten post ma 2 lata, chciałbym dodać moje posiadać dwa centy:
Jak zauważył @btford, wydaje się, że próbujesz przekształcić strukturę rekurencyjną w listę, więc najpierw powinieneś spłaszczyć tę strukturę do postaci listy. Jego rozwiązanie to robi, ale istnieje opinia, że wywołanie funkcji wewnątrz szablonu jest nieeleganckie. jeśli to prawda (szczerze mówiąc, nie wiem) czy nie wymagałoby to wykonania funkcji w kontrolerze, a nie dyrektywy?
tak czy inaczej, twój kod HTML wymaga listy, więc zakres, który renderuje, powinien mieć tę listę do pracy. wystarczy spłaszczyć strukturę wewnątrz kontrolera. gdy masz tablicę $ scope.rows, możesz wygenerować tabelę za pomocą pojedynczego, prostego powtórzenia ng. Żadnego hakowania, żadnej nieelegancji, po prostu sposób, w jaki został zaprojektowany do działania.
Dyrektywom Angulars nie brakuje funkcjonalności. Po prostu zmuszają cię do napisania prawidłowego html. Mój kolega miał podobny problem, cytując @bmoeskau na poparcie krytyki dotyczącej funkcji tworzenia szablonów / renderowania kątów. Przyglądając się dokładnemu problemowi, okazało się, że po prostu chciał wygenerować tag otwarty, potem tag zamknięty w innym miejscu, itd., Tak jak za dawnych dobrych czasów, kiedy łączyliśmy nasz kod HTML ze stringów… prawda? Nie.
jeśli chodzi o spłaszczenie struktury w listę, oto inne rozwiązanie:
zadziała to dla każdej struktury podobnej do drzewa, która zawiera elementy podrzędne. Jeśli chcesz mieć cały element zamiast właściwości, możesz jeszcze bardziej skrócić funkcję spłaszczania.
mam nadzieję, że to pomoże.
źródło
za rozwiązanie, które naprawdę działa
html
dodaj dyrektywę angular.js.
dla krótkiego wyjaśnienia,
ng-repeat wiąże się z plikiem
<remove>
elementem i zapętla się tak, jak powinno, a ponieważ użyliśmy ng-repeat-start / ng-repeat-end, zapętla blok html, a nie tylko element.następnie niestandardowa dyrektywa remove umieszcza elementy
<remove>
początkowe i końcowe za pomocą<!--removed element-->
źródło
Myślę, że to ważne :)
źródło