ChatGPT解决这个技术问题 Extra ChatGPT

Angular.js ng-repeat across multiple elements

This question has been partly addressed here: Angular.js ng-repeat across multiple tr's

However that is just a work-around really, it doesn't actually address the core issue, which is: how can one use ng-repeat across multiple elements without a wrapper?

For example, jquery.accordion requires you to repeat an h3 and div element, how could one do this with ng-repeat?


C
Coding Enthusiast

We now have a proper support for this, please see:

AngularJs Commmit

with this change you can now do:

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

In case it helps someone else... This wasn't available in either the stable, nor unstable build of AngularJs on the angularjs.org website. To get this working I had to install the bleeding-edge of Angular.js – the how-to is here: stackoverflow.com/questions/17501052/…
As @geoidesic suggests, this landed after 1.1.5, so watch for it in 1.1.6 (or very likely 1.2.0)
just must add that ng-repeat-start belong to the unstable version currently (aug 13)
And what if the second itself is a "nested" repeated? for example:
@Andre Don't do that. Rather create a new directive within your first ng-repeat.
h
hackfan

To answer Andre's question above on more than 2 levels of ng-repeat in a table, you can use multiple ng-repeat-start to accomplish this.

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

Here is a plunker example


Trying to get this work but I am only getting: Unterminated attribute, found 'ng-repeat-start' but no matching 'ng-repeat-end' found. Does this not work anymore? Using angular 1.5
v
vittore

UPDATE: This answer is outdated. Please see @IgorMinar answer and use standard ng-repeat-start and ng-repeat-end directives.

There are two options:

First option is to create directive that will render several tags and replace source tag (jsfiddle)

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 +='
another div
' } var newElement = angular.element(tmpl); $compile(newElement)(scope); element.replaceWith(newElement); } }) Second option is to use updated source code of angular that enables comment style ngRepeat directive (plnkr)
{{i}}
{{ 'foo' }}
{{ arr }}
add


Sounds great. I don't understand any of it though! In your first example I don't see ng-repeat, so I'm not sure how it's relevant (I looked at the fiddle but it is so complicated I can't make head nor tail of it). Your second example is just gobbledigook to me.
The first example doesn't address the problem because you still end up with a repeating wrapper around the two elements... i.e. the element containing the ng-repeat directive gets repeated too – I just want the inner elements to be repeated.
@user2448430 no, you don't. element.replaceWith(newElement); will replace wrapper tag with what you need. also you can have loop in your directive and add as many tags as you need into tmpl.
I disagree. Tried it and it repeats the element containing the ng-repeat directive. Also the second example isn't actually working. The div doesn't repeat, it's just the array that's being output in your plnkr example.
@JoshGough it does, so I end up adding rule to my css to hide those spans.