배열을 반복하는 대신 정의 된 횟수만큼 ng-repeat하는 방법은 무엇입니까?


417

ng-repeat항상 배열을 반복 해야하는 대신 정의 된 횟수만큼 방법이 있습니까?

예를 들어 아래에서 목록 항목을 5로 가정 $scope.number하고 숫자를 증가시키는 것으로 5 번 표시하고 각 목록 항목이 1, 2, 3, 4, 5와 같이 증가하도록하십시오.

원하는 결과 :

<ul>
   <li><span>1</span></li>
   <li><span>2</span></li>
   <li><span>3</span></li>
   <li><span>4</span></li>
   <li><span>5</span></li>
</ul>


답변:


569

업데이트 (2018 년 9 월 25 일)

최신 버전의 AngularJS (> = 1.3.0)를 사용하면 변수없이 만 기능을 수행 할 수 있습니다 (함수 필요 없음).

<li ng-repeat="x in [].constructor(number) track by $index">
    <span>{{ $index+1 }}</span>
</li>
$scope.number = 5;

질문을 처음 받았을 때는 불가능했습니다. 이 업데이트에 대한 아래 답변에서 @Nikhil Nambiar의 기여


원본 (2013 년 5 월 29 일)

현재는 ng-repeat컬렉션으로 만 매개 변수를 허용하지만 다음과 같이 할 수 있습니다.

<li ng-repeat="i in getNumber(number)">
    <span>{{ $index+1 }}</span>
</li>

컨트롤러 어딘가에 :

$scope.number = 5;
$scope.getNumber = function(num) {
    return new Array(num);   
}

이것은 당신이 변경할 수 있도록 $scope.number 원하는 바인딩을 원하는대로 하고 계속 유지할 수 있습니다.

편집 (20141/6) -최신 버전의 AngularJS (> = 1.1.5)에는 track by $index다음이 필요합니다 .

<li ng-repeat="i in getNumber(number) track by $index">
    <span>{{ $index+1 }}</span>
</li>

다음은 동일한 getNumber기능을 사용하는 몇 가지 목록 이있는 바이올린 입니다 .


여러 목록 항목에 이것을 사용하고 있지만 첫 번째 목록에서만 작동하는 것 같습니다. 왜 그런지 아십니까?
Malcr001

여러 목록에서 작동합니다. 이 바이올린을
Dan

1
다시 감사합니다. 부모 요소에서 ng-repeat를 제거하는 것을 잊었습니다. 지금 작동하고 있습니다. 감사.
Malcr001

3
$ scope.getNumber = function (num) {var x = new Array (); for (var i = 0; i <num; i ++) {x.push (i + 1); } 반환 x; } // 숫자가 동적으로 변할 때이 함수를 사용하십시오
Manavendher

1
@ sh0ber. 숫자 드롭 다운에서 선택한 값을 기준으로 목록 항목을 변경해야하는 경우 먼저 기능을 시도했지만 작동하지 않을 때 위의 항목으로 변경하여 아니오를 업데이트했습니다. 드롭 다운에서 다른 번호를 선택한 경우 목록 항목 귀하의 기능을 사용하여 내 시나리오를 확인할 수 있습니까?
Manavendher

135

당신은 이것을 할 수 있습니다 :

<div ng-repeat="i in [1, 2, 3, 4]">
  ...
</div>

1
크롬 V 테스트 매력처럼 작동 39.0.2171.95 (64 비트), FF V 33.1.1 및 Safari V 8.0.2...
NEARA

<li> <a href = "javascript :;"가 필요한 페이지 매김 제어에서 사용하는 경우 완벽하게 작동합니다. ng-click = "SelectPage ($ index)"> {{i}} </a> </ li>
Rick


1
이 답변에 명시된대로 동적 길이 배열에 대한 배열 생성자를 호출하는 것을 고려하십시오 .
maxathousand

120 번 반복해야한다면 어떨까요? [1,2,3 ... 120]과 함께 가야합니까?
Munkhdelger Tumenbayar

94

다음은이 작업을 수행하는 방법에 대한 예입니다. 나는 ng-repeat 문서의 의견에서 영감을 얻었습니다 : http://jsfiddle.net/digitalzebra/wnWY6/

ng-repeat 지시어에 유의하십시오.

<div ng-app>
    <div ng-controller="TestCtrl">
        <div ng-repeat="a in range(5) track by $index">{{$index + 1}}</div>
    </div>
</div>

컨트롤러는 다음과 같습니다.

function TestCtrl($scope) {
    $scope.range = function(n) {
        return new Array(n);
    };
};

8
_.rangeUnderscore 또는 lodash에서 배열을 작성할 수도 있습니다 . $ scope.range = _.range (0, n);
오후

83

나는이 생각 jsFiddle를 이에서 스레드 당신이 찾고있는 무슨 수 있습니다.

<div ng-app ng-controller="Main">
   <div ng-repeat="item in items | limitTo:2">
       {{item.name}}
   </div>
</div>

3
Google 스레드 링크를 자세히 읽고 '슬라이스'를 사용하는 방법에 대해 설명합니다. 예 : group1 : items.slice (0,3), group2 : items.slice (3,6) 등
trevorc

7
이 답변은 컨트롤러에서 가장 작은 공간을 차지하며 선호되는 각도 접근 방식이라고 생각합니다. IMO 수락 답변은 이것으로 대체되어야합니다.
매트 젠슨

1
이것은 내 대답으로는 받아 들일만한 대답이어야합니다. 가장 우아하고 가장 선호됩니다.
Cody

11
@Cody 불행하게도, 그것은 질문에 대답하지 않습니다. OP는 "항상 배열을 반복해야하는 대신"과 " $scope.number5로 가정 "하는 상태입니다. 의도는 정수 변수를 사용하여 항목 수를 정의하고 하드 코딩하지 않고 사전 정의 된 배열을 사용하지 않는 것입니다.
Dan

5
@Cody @ sh0ber 당신은 당신의 범위 ( $scope.limit = 2) 에서 한계를 설정하고 그것을처럼 사용할 수 있습니다 ...|limitTo:limit- 업데이트 된 바이올린을
drzaus

58

더 간단한 접근법은 다음과 같습니다 (예 : 5 배).

<div ng-repeat="x in [].constructor(5) track by $index">
       ...
</div>

5
훌륭한. 새 어레이를 반환하기 위해 컨트롤러에서 읽기 쉽고 짧으며 어리석은 기능이 없습니다.
maxathousand

2
나는이 방법을 좋아한다.
Rabbi Shuki Gur

질문이 처음 제기되었을 때 이것은 불가능했다 (Angular 1.2). 이것을 포함하도록 허용 된 답변을 수정했습니다. 좋은 작업!
Dan

1
이 구문이 왜 효과가 있는지 Array(5)(또는 실제로 [...Array(5).keys()]는 배열 [0,1,2,3,4]를 얻지 못하는지) 이해했습니다.
Dylan Nicholson

50

나는 같은 문제에 부딪쳤다. 나는이 스레드를 보았지만 여기에있는 방법을 좋아하지 않았습니다. 내 솔루션은 이미 설치 한 underscore.js를 사용하고있었습니다. 다음과 같이 간단합니다.

<ul>
    <li ng-repeat="n in _.range(1,6)"><span>{{n}}</span></li>
</ul>

이것은 당신이 찾고있는 것을 정확하게 할 것입니다.


27
이 방법은 좋지만 기본적으로 Underscore는 범위 내에 있지 않습니다 $scope._ = _. 이와 같은 작업을 수행하지 않으면 HTML보기에서 사용할 수 없습니다 .
jedd.ahyoung

6
lodash 또는 밑줄을 $rootScope사용하는 경우 어디에나 사용할 수 있도록 넣어야합니다 . 다음과 같이 app.run함수에 바로 넣으십시오 app.config. app.run(function ($rootScope) { $rootScope._ = _; });
Jeremy Moritz

이것은 나에게 완벽한 대답이었습니다. 간단하고 매우 간단합니다. 카운트가있는 변수를 사용하여 반복했기 때문에 _.range (1, count + 1)에서 ng-repeat = "n을 수행해야했습니다. 솔루션에 감사드립니다
Darryl

나는 이것을 시도했고 _가 $ rootScope에 표시되는 동안 ng-repeat는 아무것도 렌더링하지 않습니다.
Paul

49

내 HTML을 매우 작게 유지하고 싶었으므로 다른 사람들처럼 행 [0,1,2, ...]을 만드는 작은 필터를 정의했습니다.

angular.module('awesomeApp')
  .filter('range', function(){
    return function(n) {
      var res = [];
      for (var i = 0; i < n; i++) {
        res.push(i);
      }
      return res;
    };
  });

그 후에보기에서 다음과 같이 사용할 수 있습니다.

<ul>
  <li ng-repeat="i in 5 | range">
    {{i+1}} <!-- the array will range from 0 to 4 -->
  </li>
</ul>

34

이것은 실제로 추악하지만 정수 또는 변수에 대한 컨트롤러없이 작동합니다.

정수:

<span ng-repeat="_ in ((_ = []) && (_.length=33) && _) track by $index">{{$index}}</span>

변하기 쉬운:

<span ng-repeat="_ in ((_ = []) && (_.length=myVar) && _) track by $index">{{$index}}</span>

최고의 해킹! 감사
jannis

2
_ in (_ = []).length = 33; _ track by $index약간 작은
Fabricio

16

이를 수행하는 방법에는 여러 가지가 있습니다. 컨트롤러에 로직을 사용하는 데 실제로 귀찮았으므로 요소 n 번 반복 문제를 해결하는 간단한 지시문을 만들었습니다.

설치:

지시문은 다음을 사용하여 설치할 수 있습니다. bower install angular-repeat-n

예:

<span ng-repeat-n="4">{{$index}}</span

생산 : 1234

범위 변수를 사용하여 작동합니다.

<span ng-repeat-n="repeatNum"></span>

출처:

깃 허브


1
이것은 공식 각도 지시어에 추가 할 때 고려해야 할 사항입니다
HarshaXsoad

13

이것은 허용 된 답변의 약간의 변형 일뿐이지만 실제로 새로운 기능 을 만들 필요는 없습니다 . 범위에서 '배열'을 가져 오는 경우에만 :

<div ng-app="myapp">
    <div ng-controller="ctrlParent">
        <ul>
            <li ng-repeat="i in counter(5) track by $index">
              <span>{{$index+1}}</span></li>
        </ul>
    </div>
</div>
var app = angular.module('myapp',[]);
app.controller('ctrlParent',function($scope){
    $scope.myNumber = 5;
    $scope.counter = Array;
});

실제 예는 이 바이올린 을 참조하십시오 .


4
최신 (2016) 및 훨씬 더 깨끗합니다!
Julien Malige

9

가장 쉬운 답변 : 2 줄의 코드

JS (AngularJS 컨트롤러에서)

$scope.range = new Array(MAX_REPEATS); // set MAX_REPEATS to the most repetitions you will ever need in a single ng-repeat that makes use of this strategy

HTML

<div ng-repeat="i in range.slice(0,repeatCount) track by $index"></div>

... repeatCount이 위치에 나타나는 반복 횟수입니다.


1
다른 답변과 달리 함수로 랩핑하지 않는 한 HTML에서 반복 횟수를 변경하면 컨트롤러에서 HTML의 반복 횟수를 변경할 수 없습니다.
trysis

@trysis : 문제를 이해했는지 잘 모르겠지만 repeatCountHTML에서 실제 숫자로 바꿔야 하며 그 숫자가 작거나 같지 MAX_REPEATS않으면 숫자를 설정할 수 있습니다 HTML에서 반복합니다.
JellicleCat

1
제 생각에는 이것이 ngRepeat지시문 을 제한하는 가장 우아한 방법입니다 . underscore.js (브라우저 호환성에 따라 다름)와 같은 라이브러리에서 항상 사용 Array.prototype.slice및 관용 JS를 선택 해야합니다 .
Pat Migliaccio

나쁜 해결책은 아니지만, +1, 나는 이 대답 이 더 쉽다고 생각 하고 컨트롤러를 어수선하게 만듭니다.
maxathousand

8

angular는 slice 라는 매우 달콤한 기능을 제공합니다 . 이것을 사용하면 원하는 것을 얻을 수 있습니다. 예 : ng-repeat = "abc.slice (startIndex, endIndex)의 ab" "

이 데모 : http://jsfiddle.net/sahilosheal/LurcV/39/ 는이 "삶을 편하게"기능을 사용하는 방법을 알려줍니다. :)

html :

<div class="div" ng-app >
    <div ng-controller="Main">
        <h2>sliced list(conditional NG-repeat)</h2>
        <ul ng-controller="ctrlParent">
            <li ng-repeat="ab in abc.slice(2,5)"><span>{{$index+1}} :: {{ab.name}} </span></li>
        </ul>
        <h2>unsliced list( no conditional NG-repeat)</h2>
         <ul ng-controller="ctrlParent">
            <li ng-repeat="ab in abc"><span>{{$index+1}} :: {{ab.name}} </span></li>
        </ul>

    </div>

CSS :

ul
{
list-style: none;
}
.div{
    padding:25px;
}
li{
    background:#d4d4d4;
    color:#052349;
}

ng-JS :

 function ctrlParent ($scope) {
    $scope.abc = [
     { "name": "What we do", url: "/Home/AboutUs" },
     { "name": "Photo Gallery", url: "/home/gallery" },
     { "name": "What we work", url: "/Home/AboutUs" },
     { "name": "Photo play", url: "/home/gallery" },
     { "name": "Where", url: "/Home/AboutUs" },
     { "name": "playground", url: "/home/gallery" },
     { "name": "What we score", url: "/Home/AboutUs" },
     { "name": "awesome", url: "/home/gallery" },
     { "name": "oscar", url: "/Home/AboutUs" },
     { "name": "american hustle", url: "/home/gallery" }
    ];
}
function Main($scope){
    $scope.items = [{sort: 1, name: 'First'}, 
                    {sort: 2, name: 'Second'}, 
                    {sort: 3, name: 'Third'}, 
                    {sort: 4, name:'Last'}];
    }

6

각도 1.2.x에 대한 답변은 다음과 같습니다.

기본적으로는 약간의 수정으로 동일합니다. ng-repeat

<li ng-repeat="i in getNumber(myNumber) track by $index">

여기 바이올린이 있습니다 : http://jsfiddle.net/cHQLH/153/

이것은 각도 1.2가 지시문에서 중복 값을 허용하지 않기 때문입니다. 즉, 다음을 수행하려고하면 오류가 발생합니다.

<li ng-repeat="x in [1,1,1]"></li>

6

당신은 사용할 수 있습니다 ng-if지시문과 함께ng-repeat

따라서 num이 횟수 인 경우 요소를 반복해야합니다.

<li ng-repeat="item in list" ng-if="$index < num">

1
클린 마크 업을 좋아하는 분들을 위해 ... ng-repeat이런 식으로 사용하면 주석이 달린 태그 <!-- ngIf: $index < num -->등 이 계속 출력됩니다 . liDOM이 렌더링 할 요소 는 없습니다 . 결과 창에서 "소스보기"를 확인하여 무슨 뜻인지 확인하십시오.

3

이 예제를 사용할 수 있습니다.

내부 컨트롤러 :

$scope.data = {
    'myVal': 33,
    'maxVal': 55,
    'indexCount': function(count) {
        var cnt = 10;
        if (typeof count === 'number') {
            cnt = count;
        }
        return new Array(cnt);
    }
};

HTML 코드 측면에서 select 요소의 예 :

<select ng-model="data.myVal" value="{{ data.myVal }}">
    <option ng-repeat="i in data.indexCount(data.maxVal) track by $index" value="{{ $index + 1 }}">{{ $index + 1 }}</option>
</select>

3

CoffeeScript를 사용하는 사용자의 경우 범위 이해를 사용할 수 있습니다.

지령

link: (scope, element, attrs) ->
  scope.range = [1..+attrs.range]

또는 컨트롤러

$scope.range = [1..+$someVariable]
$scope.range = [1..5] # Or just an integer

주형

<div ng-repeat="i in range">[ the rest of your code ]</div>

3

Ivan의 첫 번째 대답에서 비트를 조금 확장하면 문자가 고유 한 경우 트랙별로 문을 사용하지 않고 문자열을 컬렉션으로 사용할 수 있습니다. 따라서 유스 케이스가 10 숫자 미만이면 질문처럼 :

<ul>
   <li ng-repeat="n in '12345'"><span>{{n}}</span></li>
</ul>

어느 것이 약간 기이하지만 확실하지만 혼란스럽지 않을 정도로 간단합니다.


2

먼저 LoDash를 사용하여 각도 필터를 만듭니다.

angular.module('myApp').filter('times', function(){
   return function(value){
      return _.times(value || 0);
   }
});

LoDash 시간 함수는 null, undefined, 0, 숫자 및 숫자의 문자열 표현을 처리 할 수 ​​있습니다.

그런 다음 HTML에서 다음과 같이 사용하십시오.

<span ng-repeat="i in 5 | times">
 <!--DO STUFF-->
</span>

또는

<span ng-repeat="i in myVar | times">
 <!--DO STUFF-->
</span>

1

반복을 증가시킬 수있는보다 역동적 인 솔루션이 필요했습니다.

HTML

<div ng-repeat="n in newUserCount">
<input type="text" value="" name="newuser{{n}}"/>
</div>

복사기 제어

<span class="helper" ng-click="duplicateUser()">
Create another user with the same permissions
</span>

JS

 $scope.newUserCount = Array('1');
var primaryValue = 1;
$scope.duplicateUser = function()
{
    primaryValue++;
    $scope.newUserCount.push(primaryValue)
}

1

Angular는 컬렉션을 수정하는 필터를 제공합니다. 이 경우 컬렉션은 null, 즉 []가되고 필터는 다음과 같이 인수도 취합니다.

<div id="demo">
    <ul>
        <li ng-repeat="not in []|fixedNumber:number track by $index">{{$index}}</li>
    </ul>
</div>

JS :

module.filter('fixedNumber', function() {
    return function(emptyarray, number) {
        return Array(number);
    }
});

module.controller('myCtrl', ['$scope', function($scope) {
    $scope.number = 5;
}]);

이 방법은 위에서 제안한 방법과 매우 유사하며 반드시 우수하지는 않지만 AngularJS의 필터 성능을 보여줍니다.


1

n이 너무 높지 않으면 다른 옵션은 n 문자의 문자열과 함께 split ( '')을 사용할 수 있습니다.

<div ng-controller="MainCtrl">
<div ng-repeat="a in 'abcdefgh'.split('')">{{$index}}</div>
</div>

분할이 불필요하다고 생각합니다. 문자열은 이미 문자 배열입니다.
omikes

1

나는 같은 문제에 직면했고 이것이 내가 나온 것입니다.

(function () {
  angular
    .module('app')
    .directive('repeatTimes', repeatTimes);

  function repeatTimes ($window, $compile) {
    return { link: link };

    function link (scope, element, attrs) {
      var times    = scope.$eval(attrs.repeatTimes),
          template = element.clone().removeAttr('repeat-times');

      $window._(times).times(function (i) {
        var _scope = angular.extend(scope.$new(), { '$index': i });
        var html = $compile(template.clone())(_scope);

        html.insertBefore(element);
      });

      element.remove();
    }
  }
})();

... 그리고 HTML :

<div repeat-times="4">{{ $index }}</div>

라이브 예

times프로젝트에서 이미 밑줄의 기능을 사용했지만 기본 코드로 쉽게 바꿀 수 있습니다.


0

최대 번호가 다른 ng-repeat에서 나오는 재사용 가능한 지시문을 만들고 있습니다. 따라서 이것은 최고의 투표 답변을 편집 한 것입니다.

컨트롤러의 코드를 다음과 같이 변경하십시오.

$scope.getNumber = function(num) {
    var temp = [];
    for(var j = 0; j < num; j++){
        temp.push(j)
    }
    return temp; 
}

지정된 반복 횟수로 새 배열을 반환합니다.


0

문자열을 반복하기 때문에 각 문자에 대한 항목을 렌더링합니다.

<li ng-repeat = "k in 'aaaa' track by $index">
   {{$index}} //THIS DOESN'T ANSWER OP'S QUESTION. Read below.
</li>

네이티브 필터를 사용하여이 추악 하지만 코드가없는 해결 방법을 사용할 수 있습니다 number|n decimal places.

 <li ng-repeat="k in (0|number:mynumber -2 ) track by $index">
    {{$index}}
 </li>

이런 식으로 mynumber추가 코드가없는 요소를 갖게 됩니다. 말해봐 '0.000'.
우리는 사용 mynumber - 2보상하기 위해 0.
세 이하 숫자에 대해 작동하지 않습니다 그것은, 그러나 어떤 경우에는 유용 할 수 있습니다.


사용 track by $index했습니까?
Ivan Ferrer Villa

이것은 빈민가입니다. ng-repeat="i in [1,2,3,4]"
Roit

물론, 영업 이익은 수 n 번 변수를 기반으로하는 반복을 원$scope.number
이반 페레 빌라

왜 'aaaa'대신 'abcd'가 아닌가?
omikes

aaaa내 우아하지 않은 해결 방법을 설명하는 예제였습니다. 하드 코딩 된 'aaaa'또는 'abcd'를 사용하면 고정 길이 목록이 표시되지만 10에 10 mynumber-2진수를 추가 하면 mynumber문자 가있는 '문자열'이 나타납니다 . 예를 들어 mynumber=5, '0.000'우리는 $ index를 사용하여 반복합니다
Ivan Ferrer Villa

0
$scope.number = 5;

<div ng-repeat="n in [] | range:$scope.number">
      <span>{{$index}}</span>
</div>

-1

간단한 방법 :

    public defaultCompetences: Array<number> = [1, 2, 3];

구성 요소 / 컨트롤러에서 다음을 수행하십시오.

    <div ng-repeat="i in $ctrl.defaultCompetences track by $index">

이 코드는 내 타이프 스크립트 프로젝트에서 가져온 것이지만 순수한 자바 스크립트로 재 배열 될 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.