ChatGPT解决这个技术问题 Extra ChatGPT

ng-repeat定义的次数而不是重复数组的方法?

有没有办法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>

C
Community

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

编辑 (1/6/2014) -- 较新版本的 AngularJS (>= 1.1.5) 需要 track by $index

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

Here is a fiddle 与使用相同 getNumber 函数的几个列表。


$scope.getNumber = function(num) { var x=new Array(); for(var i=0;i
@Manavendher 不正确。我们不需要填充数组,我们只需要它是 $scope.number 的长度。 Angular 的摘要循环将自动调用此函数并在 $scope.number 更改时调整数组的大小。
@sh0ber。当我需要根据数字下拉列表中选择的值更改列表项时。我先尝试了您的功能,当它不起作用时,我将其更改为上述以更新编号。在下拉列表中选择不同数字时的列表项。您能否使用您的功能检查我的情况。
@Manavendher 我尝试使用角度 1.2.x 和 1.5.x 获得相同的结果。链接是 1. stackoverflow.com/questions/40202263/… 2. plnkr.co/edit/zcPr7oUEBBWvCSVkDvml
a
akonsu

你可以这样做:

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

像魅力一样工作,在 Chrome v. 39.0.2171.95(64 位)、FF v. 33.1.1 和 Safari v. 8.0.2 上进行了测试
如果您在一个只需要
  • {{ i }}
  • @AdityaMP,将其用于 javascript stackoverflow.com/a/31989462/3160597 中的范围
    考虑为动态长度数组调用数组构造函数,如 this answer 中所述。
    如果我必须重复 120 次怎么办?我应该选择 [1,2,3... 120] 吗?
    P
    Polaris878

    这是一个如何做到这一点的例子。请注意,我的灵感来自 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);
        };
    };
    

    您还可以使用下划线或 lodash 中的 _.range 创建数组: $scope.range = _.range(0, n);
    j
    jeffmayeur

    我认为此 thread 中的此 jsFiddle 可能就是您要查找的内容。

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

    进一步阅读谷歌线程链接,它描述了如何使用“切片”。例如 group1: items.slice(0,3), group2: items.slice(3,6) 等。
    这个答案将在您的控制器中产生最小的占用空间,我相信这也是首选的 Angular 方法。 IMO 接受的答案应该用这个代替。
    这应该是公认的答案(在我看来)——最优雅,最受 ng 青睐。
    @Cody不幸的是,不,它没有回答这个问题。 OP 声明“而不是总是必须遍历数组”和“假设 $scope.number 等于 5”。目的是使用整数变量来定义项目计数,而不是对其进行硬编码,也不使用预定义的数组。
    @Cody @sh0ber 您可以在您的范围 ($scope.limit = 2) 中设置限制并像 ...|limitTo:limit 一样使用它——请参阅 updated fiddle
    n
    nik

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

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

    杰出的。控制器中的可读、简短且没有愚蠢的函数返回一个新数组。
    我喜欢这种方式。
    我只是希望我理解为什么这种语法有效但 Array(5) 无效(或者实际上 [...Array(5).keys()] 来获取数组 [0,1,2,3,4])
    M
    Mark Roach

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

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

    这将完全符合您的要求。


    这很好,但请注意默认情况下下划线不在范围内 - 如果不执行 $scope._ = _ 之类的操作,您将无法在 HTML 视图中使用它。
    如果您使用 lodash 或下划线,则应将其放在 $rootScope 中,以便可以在任何地方使用。将它放在 app.config 之后的 app.run 函数中:app.run(function ($rootScope) { $rootScope._ = _; });
    这对我来说是一个完美的答案。这很简单也很直接。由于我重复使用具有计数的变量,因此我不得不在 _.range(1, count+1) 中执行 ng-repeat="n。感谢您的解决方案。
    我试过这个,当 _ 出现在 $rootScope 中时,ng-repeat 没有渲染任何东西。
    F
    Felipe Leão

    我想保持我的 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>
    

    M
    Michael Allan Jackson

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

    整数:

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

    多变的:

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

    有史以来最好的黑客!谢谢
    _ in (_ = []).length = 33; _ track by $index 略小
    M
    Mo.

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

    安装:

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

    例子:

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

    产生:1234

    它也可以使用范围变量:

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

    资源:

    Github


    这是他们应该考虑添加到官方角度指令中的内容
    S
    Sylvain Leroux

    这只是对已接受答案的微小变化,但您实际上并不需要创建新函数。仅在范围内导入“数组”:

    <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;
    });
    

    请参阅 this fiddle 以获取实时示例。


    最新(2016)和更清洁!
    J
    JellicleCat

    最简单的答案: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 是应出现在此位置的重复次数。


    我相信这不会让您更改 HTML 中的重复次数,如果它在控制器中更改,除非您将它包装在一个函数中,就像其他答案所做的那样。
    @trysis:我不确定我是否理解您的问题,但您应该将 repeatCount 替换为 HTML 中的实际数字,并且只要该数字小于或等于 MAX_REPEATS,这将允许您设置 HTML 中的重复次数。
    在我看来,这是限制 ngRepeat 指令的最优雅的方式。应该始终选择使用 Array.prototype.slice 和惯用的 JS,而不是像 underscore.js 之类的库(取决于浏览器兼容性)。
    不错的解决方案,+1,但我认为 this answer 更容易,并且避免了控制器的混乱。
    S
    Sheelpriy

    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'}];
        }
    

    D
    DrogoNevets

    这是角度 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>
    

    a
    akaashanky

    您可以将 ng-if 指令与 ng-repeat 一起使用

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

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

    对于那些喜欢干净标记的人...请记住,以这种方式使用 ng-repeat 仍会输出它的注释标签(<!-- ngIf: $index < num --> 等)。根本不会有任何 li 元素供 DOM 呈现。检查 results pane here 上的“查看源代码”以了解我的意思。
    M
    Mo.

    对于使用 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>
    

    o
    omikes

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

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

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


    e
    elceka

    你可以使用这个例子。

    内部控制器:

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

    K
    Karanvir Kang

    首先,使用 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>
    

    J
    Johansrk

    和 2021 版本

    *ngFor="let x of [].constructor(number)"
    

    N
    Nik Dow

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


    v
    vonwolf

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

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

    我相信这里的分裂是不必要的。一个字符串已经是一个字符数组。
    i
    ichigolas

    我遇到了同样的问题,这就是我得出的结论:

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

    LIVE EXAMPLE

    我使用了下划线的 times 函数,因为我们已经在项目中使用了它,但是您可以轻松地将其替换为本机代码。


    a
    adswebwork

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

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

    m
    msanford

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

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

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

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


    I
    Ivan Ferrer Villa

    因为迭代一个字符串,它将为每个字符呈现一个项目:

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

    我们可以使用这个 ugly 但使用 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 以下的数字,但在某些情况下可能有用。


    你用过track by $index吗?
    这是贫民区。如果您将被迫为每次迭代使用一个字符,您不妨这样做 ng-repeat="i in [1,2,3,4]"
    当然,但是 OP 希望基于变量 $scope.number 进行 n 次迭代
    为什么不用 'abcd' 而不是 'aaaa' 然后废弃曲目呢?
    aaaa 是一个示例来解释我的 - 不是很优雅 - 解决方法。使用硬编码的 'aaaa' 或 'abcd' 你会得到一个固定长度的列表,但是将 mynumber-2 个小数添加到 0,你会得到一个带有 mynumber 个字符的 'string'。说 mynumber=5,你得到 '0.000',然后我们使用 $index 对其进行迭代
    D
    DuFuS
    $scope.number = 5;
    
    <div ng-repeat="n in [] | range:$scope.number">
          <span>{{$index}}</span>
    </div>
    

    P
    Pallepassion

    简单的方法:

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

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

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

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