Angular.js ng-повтор через кілька елементів


83

Це питання було частково розглянуто тут: Angular.js ng-repeat у кількох tr

Однак це насправді лише навколо роботи, насправді це не стосується основної проблеми, а саме: як можна використовувати ng-repeat у кількох елементах без обгортки?

Наприклад, jquery.accordion вимагає повторити елемент h3 та div, як це можна зробити за допомогою ng-repeat?

Відповіді:


159

Зараз ми маємо належну підтримку для цього, перегляньте:

Комітет AngularJs

за допомогою цієї зміни ви тепер можете зробити:

<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
На випадок, якщо це допоможе комусь іншому ... Це не було доступно ні в стабільній, ні в нестабільній версії AngularJ на веб-сайті angularjs.org. Для того, щоб отримати цю роботу , я повинен був встановити, що кровоточить-край Angular.js - як-к тут: stackoverflow.com/questions/17501052 / ...
geoidesic

3
Як припускає @geoidesic, це приземлилося після 1.1.5, тому слідкуйте за цим в 1.1.6 (або, швидше за все, 1.2.0)
Ансон,

1
Треба лише додати, що ng-repeat-start належать до нестабільної версії (13
серпня

1
А що, якщо другий <tr> сам є "вкладеним" повторенням? наприклад: <tr ng-repeat-start = ".."> </tr> <tr ng-repeat = "somethingelse" nt-repeat-stop> </tr>
Андре

@Andre Не роби цього. Швидше створіть нову директиву в першому ng-повторі.
geoidesic

22

Щоб відповісти на вищезазначене питання Андре на більш ніж 2 рівнях ng-repeat у таблиці, ви можете використати кілька ng-repeat-start для цього.

<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>

Ось приклад плюнка


Намагаючись отримати цю роботу, але я отримую лише: Невизначений атрибут, знайдено 'ng-repeat-start', але не знайдено відповідного 'ng-repeat-end'. Це вже не працює? Використання кутових 1,5
стибай

3

ОНОВЛЕННЯ : Ця відповідь застаріла. Будь ласка, перегляньте відповідь @IgorMinar та використовуйте стандарт ng-repeat-startта ng-repeat-endдирективи.


Є два варіанти:

Перший варіант - створити директиву, яка буде відображати кілька тегів і замінювати вихідний тег ( 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); 
    }
})

Другий варіант - використовувати оновлений вихідний код angular, що включає директиву стилю коментарів ngRepeat ( 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>  


Звучить шикарно. Я нічого з цього не розумію! У вашому першому прикладі я не бачу ng-repeat, тому я не впевнений, наскільки це актуально (я дивився на скрипку, але це настільки складно, що я не можу зробити ні голови, ні хвоста). Ваш другий приклад - це просто пожирання для мене.
geoidesic

Перший приклад не вирішує проблему, оскільки ви все одно отримуєте повторювальну обгортку навколо двох елементів ... тобто елемент, що містить директиву ng-repeat, теж повторюється - я просто хочу, щоб внутрішні елементи повторилися.
geoidesic

@ user2448430 ні, ти ні. element.replaceWith(newElement);замінить тег обгортки тим, що вам потрібно. також ви можете мати цикл у своїй директиві та додати стільки тегів, скільки вам потрібно в tmpl.
vittore

Я не погоджуюсь. Спробував, і він повторює елемент, що містить директиву ng-repeat. Також другий приклад насправді не працює. Div не повторюється, це просто масив, який виводиться у вашому прикладі plnkr.
geoidesic

1
@JoshGough це робить, тому в підсумку я додаю правило в свій css, щоб приховати ці прольоти.
vittore
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.