Angular.js ng-repeat 여러 요소에서


83

이 질문은 부분적으로 여기에서 해결되었습니다 : Angular.js ng-repeat across multiple tr 's

그러나 이것은 실제로 해결 방법 일 뿐이며 실제로 핵심 문제를 해결하지 않습니다. 즉, 래퍼없이 여러 요소에서 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
다른 사람에게 도움이되는 경우 ... 이것은 angularjs.org 웹 사이트의 AngularJs의 안정된 빌드 나 불안정한 빌드에서 사용할 수 없었습니다. 이 작업을 수행하려면 Angular.js의 최신 버전을 설치해야했습니다. 방법은 여기에 있습니다. stackoverflow.com/questions/17501052/…
geoidesic

3
@geoidesic이 제안한 것처럼 이것은 1.1.5 이후에 착륙 했으므로 1.1.6 (또는 1.2.0 가능성이 매우 높음)에서 확인하십시오
Anson

1
ng-repeat-start가 현재 불안정한 버전에 속한다고 추가해야합니다 (
bresleveloper

1
두 번째 <tr> 자체가 "중첩"반복이면 어떻게 될까요? 예 : <tr ng-repeat-start = ".."> </ tr> <tr ng-repeat = "somethingelse"nt-repeat-stop> </ tr>
Andre

@Andre 그렇게하지 마십시오. 오히려 첫 번째 ng-repeat 내에서 새 지시문을 작성하십시오.
geoidesic

22

테이블에서 2 개 이상의 ng-repeat 수준에 대한 Andre의 질문에 답하려면 여러 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 사용
stibay

3

업데이트 :이 답변은 구식입니다. @IgorMinar 답변을 참조하고 표준 ng-repeat-startng-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); 
    }
})

두 번째 옵션은 주석 스타일 ngRepeat 지시문 ( plnkr ) 을 활성화하는 angular의 업데이트 된 소스 코드를 사용하는 것입니다.

<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 2013-06-03

@ user2448430 아니, 그렇지 않습니다. element.replaceWith(newElement);래퍼 태그를 필요한 것으로 대체합니다. 또한 지시문에 루프를 포함하고 tmpl에 필요한만큼 태그를 추가 할 수 있습니다.
vittore 2013-06-03

동의하지 않습니다. 그것을 시도하고 ng-repeat 지시문을 포함하는 요소를 반복합니다. 또한 두 번째 예는 실제로 작동하지 않습니다. div는 반복되지 않으며 plnkr 예제에서 출력되는 배열입니다.
geoidesic

1
@JoshGough 그것은 그렇습니다, 그래서 그 범위를 숨기기 위해 내 CSS에 규칙을 추가합니다.
vittore
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.