Angular.js ng-repeat trên nhiều phần tử


83

Câu hỏi này đã được giải đáp một phần ở đây: Angular.js ng-repeat over multiple tr

Tuy nhiên, đó chỉ là một công việc thực sự, nó không thực sự giải quyết vấn đề cốt lõi, đó là: làm thế nào người ta có thể sử dụng ng-repeat trên nhiều phần tử mà không có trình bao bọc?

Ví dụ: jquery.accordion yêu cầu bạn lặp lại phần tử h3 và div, làm thế nào người ta có thể thực hiện điều này với ng-repeat?

Câu trả lời:


159

Chúng tôi hiện có một hỗ trợ thích hợp cho việc này, vui lòng xem:

AngularJs Commmit

với thay đổi này bây giờ bạn có thể làm:

<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
Trong trường hợp nó giúp ích cho người khác ... Điều này không có sẵn trong bản dựng AngularJs ổn định và không ổn định trên trang web anglejs.org. Để có được làm việc này, tôi đã phải cài đặt phần gay cấn của Angular.js - như thế nào-to là ở đây: stackoverflow.com/questions/17501052/...
geoidesic

3
Như @geoidesic gợi ý, điều này đã hạ cánh sau 1.1.5, vì vậy xem cho nó trong 1.1.6 (hoặc rất có khả năng 1.2.0)
Anson

1
chỉ phải thêm rằng ng-repeat-bắt đầu thuộc về hiện phiên bản không ổn định (13 tháng 8)
bresleveloper

1
Và điều gì sẽ xảy ra nếu bản thân <tr> thứ hai là một "lồng nhau" được lặp lại? ví dụ: <tr ng-repeat-start = ".."> </tr> <tr ng-repeat = "somethingelse" nt-repeat-stop> </tr>
Andre

@Andre Đừng làm vậy. Thay vì tạo một chỉ thị mới trong lần lặp lại đầu tiên của bạn.
geoidesic

22

Để trả lời câu hỏi của Andre ở trên về hơn 2 cấp độ ng-repeat trong một bảng, bạn có thể sử dụng nhiều ng-repeat-start để thực hiện điều này.

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

Đây là một ví dụ về plunker


Đang cố gắng hoàn thành công việc này nhưng tôi chỉ nhận được: Thuộc tính chưa kết thúc, tìm thấy 'ng-repeat-start' nhưng không tìm thấy 'ng-repeat-end' phù hợp. Điều này không hoạt động nữa? Sử dụng góc 1,5
stibay

3

CẬP NHẬT : Câu trả lời này đã lỗi thời. Vui lòng xem câu trả lời của @IgorMinar và sử dụng tiêu chuẩn ng-repeat-startng-repeat-endchỉ thị.


Có hai lựa chọn:

Tùy chọn đầu tiên là tạo chỉ thị sẽ hiển thị một số thẻ và thay thế thẻ nguồn ( 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); 
    }
})

Tùy chọn thứ hai là sử dụng mã nguồn được cập nhật của góc cho phép kiểu bình luận ngRepeat chỉ thị ( 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>  


Nghe hay đấy. Tôi không hiểu bất kỳ điều gì trong số đó! Trong ví dụ đầu tiên của bạn, tôi không thấy ng-repeat, vì vậy tôi không chắc nó có liên quan như thế nào (tôi đã nhìn vào fiddle nhưng nó phức tạp đến mức tôi không thể hiểu đầu hay đuôi của nó). Ví dụ thứ hai của bạn chỉ là gobbledigook đối với tôi.
geoidesic

Ví dụ đầu tiên không giải quyết được vấn đề bởi vì bạn vẫn kết thúc với một trình bao bọc lặp lại xung quanh hai phần tử ... tức là phần tử chứa chỉ thị ng-repeat cũng được lặp lại - Tôi chỉ muốn các phần tử bên trong được lặp lại.
geoidesic

@ user2448430 không, bạn không. element.replaceWith(newElement);sẽ thay thế thẻ wrapper bằng những gì bạn cần. Ngoài ra, bạn có thể có vòng lặp trong chỉ thị của mình và thêm nhiều thẻ tùy ý vào tmpl.
vittore

Tôi không đồng ý. Đã thử nó và nó lặp lại phần tử chứa chỉ thị ng-repeat. Ngoài ra, ví dụ thứ hai không thực sự hoạt động. Div không lặp lại, nó chỉ là mảng được xuất trong ví dụ plnkr của bạn.
geoidesic

1
@JoshGough nó có, vì vậy tôi kết thúc việc thêm quy tắc vào css của mình để ẩn những nhịp đó.
vittore
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.