433

有没有一种方法可以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>
4

27 回答 27

587

更新(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为任何数字,并且仍然保持您正在寻找的绑定。

编辑(2014 年 1 月 6 日) ——较新版本的 AngularJS(>= 1.1.5)需要track by $index

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

getNumber这是使用相同功能的几个列表的小提琴。

于 2013-05-29T22:26:10.547 回答
141

你可以这样做:

<div ng-repeat="i in [1, 2, 3, 4]">
  ...
</div>
于 2014-02-16T00:53:07.800 回答
93

这是一个如何做到这一点的例子。请注意,我受到 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);
    };
};
于 2013-05-29T22:28:24.597 回答
84

我认为这个线程中的这个jsFiddle可能是你正在寻找的。

<div ng-app ng-controller="Main">
   <div ng-repeat="item in items | limitTo:2">
       {{item.name}}
   </div>
</div>
于 2013-05-29T22:27:19.940 回答
62

一种更简单的方法是(例如 5 次):

<div ng-repeat="x in [].constructor(5) track by $index">
       ...
</div>
于 2017-06-16T17:22:42.110 回答
49

我遇到了同样的问题。我遇到了这个线程,但不喜欢他们在这里的方法。我的解决方案是使用我们已经安装的 underscore.js。就这么简单:

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

这将完全符合您的要求。

于 2014-01-10T23:12:42.460 回答
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>
于 2015-04-10T02:43:02.793 回答
34

这真的很丑陋,但它可以在没有控制器的情况下用于整数或变量:

整数:

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

多变的:

<span ng-repeat="_ in ((_ = []) && (_.length=myVar) && _) track by $index">{{$index}}</span>
于 2015-01-16T21:33:23.160 回答
16

有很多方法可以做到这一点。我真的很担心控制器中的逻辑,所以我创建了一个简单的指令来解决重复元素 n 次的问题。

安装:

该指令可以使用安装bower install angular-repeat-n

例子:

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

产生:1234

它也可以使用范围变量:

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

来源:

Github

于 2014-08-09T21:19:00.013 回答
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;
});

请参阅此小提琴以获取实时示例。

于 2016-01-29T00:50:27.123 回答
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是应该出现在这个位置的重复次数。

于 2014-12-10T18:17:03.933 回答
8

angular 提供了一个非常漂亮的函数,称为slice .. 使用它你可以实现你想要的。 例如 ng-repeat="abc.slice(startIndex,endIndex)"

这个演示: 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'}];
    }
于 2014-03-03T07:37:46.600 回答
6

这是角度 1.2.x 的答案

基本上是一样的,只是稍作修改ng-repeat

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

这是小提琴:http: //jsfiddle.net/cHQLH/153/

这是因为 angular 1.2 不允许指令中出现重复值。这意味着如果您尝试执行以下操作,您将收到错误消息。

<li ng-repeat="x in [1,1,1]"></li>
于 2014-05-14T09:19:08.883 回答
6

您可以将ng-if指令与ng-repeat

因此,如果 num 是您需要重复元素的次数:

<li ng-repeat="item in list" ng-if="$index < num">
于 2015-08-27T14:33:43.307 回答
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>
于 2015-07-18T17:10:51.077 回答
3

稍微扩展一下 Ivan 的第一个答案,只要字符是唯一的,您就可以使用字符串作为不带 track by 语句的集合,所以如果用例少于 10 个数字(因为它在问题中)我会只需这样做:

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

当然,这有点笨拙,但看起来很简单,而且不会特别令人困惑。

于 2018-02-21T23:07:34.500 回答
2

你可以使用这个例子。

内部控制器:

$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>
于 2013-12-12T15:23:52.123 回答
2

首先,使用 LoDash 创建一个角度过滤器:

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

LoDash 时间函数能够处理 null、未定义、0、数字和数字的字符串表示形式。

然后,在您的 HTML 中使用它,如下所示:

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

或者

<span ng-repeat="i in myVar | times">
 <!--DO STUFF-->
</span>
于 2016-10-20T17:54:25.537 回答
2

和 2021 版本

*ngFor="let x of [].constructor(number)"
于 2021-03-02T16:31:13.027 回答
1

Angular 提供过滤器来修改集合。在这种情况下,集合将为空,即 [],并且过滤器也接受参数,如下所示:

<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 中过滤器的强大功能。

于 2014-03-06T00:07:43.863 回答
1

如果 n 不是太高,另一种选择是使用 split('') 和 n 个字符的字符串:

<div ng-controller="MainCtrl">
<div ng-repeat="a in 'abcdefgh'.split('')">{{$index}}</div>
</div>
于 2014-07-07T13:07:09.133 回答
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功能,因为我们已经在项目中使用了它,但是您可以轻松地将其替换为本机代码。

于 2015-08-06T20:09:59.003 回答
0

我需要一个更动态的解决方案——我可以增加重复。

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)
}
于 2013-12-05T14:54:54.230 回答
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.
它不适用于 3 以下的数字,但在某些情况下可能有用。

于 2014-04-22T20:40:01.700 回答
0

我正在创建一个可重用的指令,其中最大数量将来自另一个 ng-repeat。因此,这是对最佳投票答案的编辑。

只需将控制器上的代码更改为 -

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

这将返回一个具有指定迭代次数的新数组

于 2017-08-03T18:13:17.533 回答
0
$scope.number = 5;

<div ng-repeat="n in [] | range:$scope.number">
      <span>{{$index}}</span>
</div>
于 2019-05-14T07:48:26.320 回答
-1

简单的方法:

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

在组件/控制器中,然后:

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

此代码来自我的打字稿项目,但可以重新排列为纯 javascript

于 2017-11-29T14:51:13.977 回答