【问题标题】:ng-repeat specify a starting indexng-repeat 指定起始索引
【发布时间】:2015-04-09 06:40:30
【问题描述】:

如何指定 ng-repeat 指令开始的索引而不是零?

我有一组结果,我只需要指定起始结果,它不为零。

【问题讨论】:

  • 如果您需要对结果集进行排序或修改,请考虑使用过滤器。

标签: angularjs angularjs-ng-repeat


【解决方案1】:

无需编写任何代码,Angular 已使用 现有 内置 limitTo 过滤器完成此操作。只需使用负限制。来自limit 参数的文档:

返回的数组或字符串的长度。如果限制数是 正数,从源头开始限制项目数 数组/字符串被复制。 如果数字是负数,限制数量 复制源数组/字符串末尾的项目。限制 如果超过 array.length 将被修剪。如果未定义限制,则 输入将原样返回。

所以你可以在模板中这样使用它:

<ul>
   <li data-ng-repeat="i in list | limitTo: (offset - list.length)">{{i}}</li>
</ul>

offset 是您的起始索引。参见示例plunker

有一个可选的begin 参数,因此您不需要使用否定的limit,但begin 在angular v1.4 之前不可用,所以在我的示例中我坚持使用否定的limit

【讨论】:

  • 最优雅的解决方案!谢谢!
  • 使用 $index 值有问题(例如从列表中删除元素)一些建议? (我使用 [$index + offset] 但我正在寻找更好的方法)
  • @SilvioTroia 我通常避免使用 $index 来索引列表中的元素,因为它是显示内容的索引,而不是数组的索引(如果有意义的话)。对于删除,我会执行类似list.splice(list.indexOf(i), 1) 的操作,其中i 是您要删除的列表中的元素。
【解决方案2】:

答案似乎很老了,

由于角度1.4.0limitTo 过滤器需要两个参数

limitTo: (limit) : (begin)

你可以说ng-repeat="item in list | limitTo:50:0"

这似乎是一个非常有效的解决方案,而不是使用两个不同的过滤器。

https://code.angularjs.org/1.4.0/docs/api/ng/filter/limitTo

【讨论】:

【解决方案3】:

你可以创建一个过滤器

app.filter('startFrom', function() {
    return function(input, start) {
        if(input) {
            start = +start; //parse to int
            return input.slice(start);
        }
        return [];
    }
});

然后你只需在 ng-repeat 上使用它:

<div ng-repeat="item in items | startFrom : 2">{{item.Name}}</div>

【讨论】:

  • 你把app.filter放在哪里?在 controller.js 或 app.js 中?
  • "the" app 变量是你通过调用 angular.module() 获得的一个变量
  • 很好的模块化解决方案。
【解决方案4】:

假设你有一个items 的列表,你可以这样做:

<div ng-repeat="item in items" ng-if="$index >= myIndex">
   {{item.Name}}
</div>

【讨论】:

  • 这个删除了一个元素,我想重新使用它们并从一个不同于 0 的元素开始。
  • @FedericoVezzoli 如果您需要求助,那么我建议您迭代不同的对象,在控制器中进行排序,或者按照其他人的建议进行过滤。
【解决方案5】:

我将创建一个返回所需子数组的函数。这可以进入控制器或指令的链接函数中。

<span ng-repeat="item in getSubArray(0, 4)">...</span>

还有功能

$scope.getSubArray = function (start, end) {
   return array.slice(start, end);
}

【讨论】:

  • 我应该说 Emanuel 的过滤器是一个更好的解决方案,因为它更易于重复使用
【解决方案6】:

这对我有用:

<element ng-repeat="round in view.rounds track by $index">
    <span>{{$index + 1}}</span>
</element>

【讨论】:

    【解决方案7】:

    这可以解决问题...

    <div ng-repeat="(i, item) in items">
        <p>{{i+1}}</p>
    </div>
    

    【讨论】:

      【解决方案8】:

      一种简单但不那么吸引人的方式

       ng-repeat="item in model | limitTo: 10 | limitTo: -5"
      

      【讨论】:

        【解决方案9】:

        这是我正在寻找的结果:

        angular.module('starter.filters', []).filter('startFrom', function() {
        return function(input, start) {
            if(input) {
                start = +start; //parse to int
                appended = input.slice(0,start);
                initialArray = input.slice(start);
                finalArray= initialArray.concat(appended);
                return finalArray;
            }
            return [];
        }
        });
        

        感谢@emanuel

        【讨论】:

          猜你喜欢
          • 2014-06-11
          • 2014-09-29
          • 2013-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多