Angular.js ng-repeat w wielu elementach


83

To pytanie zostało częściowo rozwiązane tutaj: Angular.js ng-repeat w wielu tr

Jednak jest to tylko obejście, tak naprawdę nie rozwiązuje podstawowego problemu, którym jest: jak można użyć ng-powtórzenia w wielu elementach bez opakowania?

Na przykład jquery.accordion wymaga powtórzenia elementu h3 i div, jak można to zrobić z ng-repeat?

Odpowiedzi:


159

Mamy teraz odpowiednie wsparcie, zobacz:

AngularJs Commmit

dzięki tej zmianie możesz teraz:

<table>
  <tr ng-repeat-start="item in list">
      <td>I get repeated</td>
  </tr>
  <tr ng-repeat-end>
      <td>I also get repeated</td>
  </tr>
</table>

1
Na wypadek, gdyby pomogło to komuś innemu ... Nie było to dostępne ani w stabilnej, ani w niestabilnej wersji AngularJs na stronie angularjs.org. Aby to zadziałało, musiałem zainstalować krwawiącą krawędź Angular.js - instrukcja jest tutaj: stackoverflow.com/questions/17501052/ ...
— geoidesic

3
Jak sugeruje @geoidesic, wylądował po 1.1.5, więc uważaj na to w 1.1.6 (lub bardzo prawdopodobne 1.2.0)
— Anson,

1
muszę tylko dodać, że ng-repeat-start należą obecnie do niestabilnej wersji (13
— bresleveloper

1
A co, jeśli drugi element <tr> sam jest „zagnieżdżony”? na przykład: <tr ng-repeat-start = ".."> </tr> <tr ng-repeat = "somethingelse" nt-repeat-stop> </tr>
— Andre

@Andre Nie rób tego. Zamiast tego utwórz nową dyrektywę w swoim pierwszym powtórzeniu ng.
— geoidesic

22

Aby odpowiedzieć na powyższe pytanie Andre dotyczące więcej niż 2 poziomów ng-repeat w tabeli, możesz użyć wielu ng-repeat-start, aby to osiągnąć.

<tr ng-repeat-start="items in list">
   <td>{{items.title}}</td>
</tr>
<tr ng-repeat-start="item in items">
   <td>{{item.subtitle}}</td>
</tr>
<tr ng-repeat-end ng-repeat="value in item.values">
   <td>{{value.col1}}</td>
   <td>{{value.col2}}</td>
</tr>
<tr ng-repeat-end></tr>

Oto przykład plunkera


Próbuję uzyskać tę pracę, ale otrzymuję tylko: Niezakończony atrybut, znaleziono „ng-powtórzenie-start”, ale nie znaleziono pasującego „ng-powtórzenie-koniec”. Czy to już nie działa? Korzystanie z kątowego 1,5
— stibay

3

AKTUALIZACJA : Ta odpowiedź jest nieaktualna. Zobacz odpowiedź @IgorMinar i użyj norm ng-repeat-starti ng-repeat-enddyrektyw.


Istnieją dwie możliwości:

Pierwsza opcja to stworzenie dyrektywy, która wyrenderuje kilka tagów i zastąpi tag źródłowy ( jsfiddle )

<div multi ></div>

angular.module('components').directive('multi', function ($compile) {
return {
    restrict: 'A',
    scope : {
       first : '=',
       last : '=',
    },        
    terminal:true,

    link: function (scope, element, attrs) {
       var tmpl = '', arr = [0,1,2,3]

       // this is instead of your repeater
       for (var i in arr) {
          tmpl +='<div>another div</div>'
       }

       var newElement = angular.element(tmpl);
       $compile(newElement)(scope);
       element.replaceWith(newElement); 
    }
})

Drugą opcją jest użycie zaktualizowanego kodu źródłowego angulara, który włącza dyrektywę ngRepeat w stylu komentarzy ( plnkr )

<body ng-controller="MainCtrl">
 <div ng-init="arr=[0,1,2]" ></div>
   <!-- directive: ng-repeat i in arr -->
     <div>{{i}}</div>
     <div>{{ 'foo' }}</div>  
   <!-- /ng-repeat -->

   {{ arr }}

  <div ng-click="arr.push(arr.length)">add</div>
</body>  


Brzmi wspaniale. Jednak nic z tego nie rozumiem! W twoim pierwszym przykładzie nie widzę powtórzenia ng, więc nie jestem pewien, jak to jest istotne (patrzyłem na skrzypce, ale jest tak skomplikowane, że nie mogę z tego zrobić głowy ani ogona). Twój drugi przykład jest dla mnie po prostu gobbledigook.
— geoidesic

Pierwszy przykład nie rozwiązuje problemu, ponieważ nadal kończy się powtarzającym się opakowaniem wokół dwóch elementów ... tj. Element zawierający dyrektywę ng-repeat również się powtarza - chcę po prostu powtórzyć elementy wewnętrzne.
— geoidesic

@ user2448430 nie, nie masz. element.replaceWith(newElement);zastąpi tag opakowania tym, czego potrzebujesz. również możesz mieć pętlę w swojej dyrektywie i dodać tyle tagów, ile potrzebujesz do tmpl.
— vittore

Nie zgadzam się. Wypróbowałem i powtarza element zawierający dyrektywę ng-repeat. Również drugi przykład tak naprawdę nie działa. Element div się nie powtarza, to tylko tablica, która jest wyświetlana w przykładzie z plnkr.
— geoidesic

1
@JoshGough to robi, więc w końcu dodaję regułę do mojego css, aby ukryć te rozpiętości.
— vittore
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.