AngularJS For Loop with Numbers&Ranges

mat*_*sko 248 angularjs angularjs-ng-repeat

Angular确实为在HTML指令中使用数字的for循环提供了一些支持:

<div data-ng-repeat="i in [1,2,3,4,5]">
  do something
</div>
Run Code Online (Sandbox Code Playgroud)

但是,如果您的范围变量包含具有动态数字的范围,那么您每次都需要创建一个空数组.

在控制器中

var range = [];
for(var i=0;i<total;i++) {
  range.push(i);
}
$scope.range = range;
Run Code Online (Sandbox Code Playgroud)

在HTML中

<div data-ng-repeat="i in range">
  do something
</div>
Run Code Online (Sandbox Code Playgroud)

这是有效的,但这是不必要的,因为我们不会在循环中使用范围数组.有没有人知道为最小/最大值设置范围或常规?

就像是:

<div data-ng-repeat="i in 1 .. 100">
  do something
</div>
Run Code Online (Sandbox Code Playgroud)

Glo*_*opy 275

我稍微调整了这个答案,想出了这个小提琴.

过滤器定义为:

var myApp = angular.module('myApp', []);
myApp.filter('range', function() {
  return function(input, total) {
    total = parseInt(total);

    for (var i=0; i<total; i++) {
      input.push(i);
    }

    return input;
  };
});
Run Code Online (Sandbox Code Playgroud)

使用这样的重复:

<div ng-repeat="n in [] | range:100">
  do something
</div>
Run Code Online (Sandbox Code Playgroud)

  • @IanWarburton你能提出符合你标准的答案吗? (10认同)
  • 可怕!;)过滤器不是这样做的方法.它应该是一个与*two*值一起使用的新属性.当前指数和上限. (5认同)

sqr*_*ren 146

我提出了一个更简单的版本,用于创建两个定义数字之间的范围,例如.5到15

请参阅JSFiddle上的演示

HTML:

<ul>
    <li ng-repeat="n in range(5,15)">Number {{n}}</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

控制器:

$scope.range = function(min, max, step) {
    step = step || 1;
    var input = [];
    for (var i = min; i <= max; i += step) {
        input.push(i);
    }
    return input;
};
Run Code Online (Sandbox Code Playgroud)

  • 你必须注意这样的事情.对于列表中的每个项,将多次调用范围函数.您可能会遇到令人讨厌的内存泄漏,并且您正在生成大量函数调用.将集合放入控制器中似乎更容易. (14认同)

Maë*_*son 87

除了简单的Javascript(你甚至不需要控制器):

<div ng-repeat="n in [].constructor(10) track by $index">
    {{ $index }}
</div>
Run Code Online (Sandbox Code Playgroud)

在模拟时非常有用


Mor*_*gil 69

我想出了一个略微不同的语法,它更适合我,并添加了一个可选的下限:

myApp.filter('makeRange', function() {
        return function(input) {
            var lowBound, highBound;
            switch (input.length) {
            case 1:
                lowBound = 0;
                highBound = parseInt(input[0]) - 1;
                break;
            case 2:
                lowBound = parseInt(input[0]);
                highBound = parseInt(input[1]);
                break;
            default:
                return input;
            }
            var result = [];
            for (var i = lowBound; i <= highBound; i++)
                result.push(i);
            return result;
        };
    });
Run Code Online (Sandbox Code Playgroud)

你可以用作

<div ng-repeat="n in [10] | makeRange">Do something 0..9: {{n}}</div>
Run Code Online (Sandbox Code Playgroud)

要么

<div ng-repeat="n in [20, 29] | makeRange">Do something 20..29: {{n}}</div>
Run Code Online (Sandbox Code Playgroud)


Arn*_*ema 31

对于那些刚接触到angularjs的人.可以使用$ index获取索引.

例如:

<div ng-repeat="n in [] | range:10">
    do something number {{$index}}
</div>
Run Code Online (Sandbox Code Playgroud)

当你使用Gloopy的便捷过滤器打印时,打印:
做0号
做第1号
做第2
事做第3
事做第3 事做第4
事做第5
事做第6
事做第7
事做第8事
做9号事

  • 是的,但在这种情况下,做一些数字{{n}}`也足够了. (7认同)
  • 当我尝试在Chrome中运行此代码时,我在控制台中收到错误:错误:[$ injector:unpr] http://errors.angularjs.org/1.2.6/$injector/unpr?p0=rangeFilterProvider%20% 3C-%20rangeFilter ......在Wa.statements(https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js:156:273)<! - ngRepeat :n在[] |中 范围:10 - >(不幸的是整个错误太长而无法容纳允许的评论长度所以我只是复制了第一行和最后一行) (2认同)

Mic*_*ins 21

这样做的一个简单方法是使用Underscore.js的_.range()方法.:)

http://underscorejs.org/#range

// declare in your controller or wrap _.range in a function that returns a dynamic range.
var range = _.range(1, 11);

// val will be each number in the array not the index.
<div ng-repeat='val in range'>
    {{ $index }}: {{ val }}
</div>
Run Code Online (Sandbox Code Playgroud)

  • 我已经到处使用lodash,这是迄今为止最简单的解决方案.谢谢.我刚做了$ scope.range = _.range,然后它很容易在任何带有动态开始/结束值的模板中使用. (5认同)
  • 没错,他从来没有这么说过.但通过应用另一个库来解决一个库中的问题通常是一个坏主意,它只是阻止您学习如何正确使用第一个库.当/如果当前没有好的解决方案时转到另一个库. (4认同)
  • @ErikHonn:UnderscoreJS为AngularJS解决了一个完全不同的问题.在AngularJS中生成范围没有好的解决方案,因为这不是库的目的. (2认同)
  • 这是旧的,但肯定使用一个设计用于创建范围的库,而不是以非语义方式滥用当前库中的功能是一个更好的方法吗?当然,你可能会学到一些东西,但最终会因为其他东西而设计的东西被扭曲. (2认同)

ple*_*ock 20

我使用自定义ng-repeat-range指令:

/**
 * Ng-Repeat implementation working with number ranges.
 *
 * @author Umed Khudoiberdiev
 */
angular.module('commonsMain').directive('ngRepeatRange', ['$compile', function ($compile) {
    return {
        replace: true,
        scope: { from: '=', to: '=', step: '=' },

        link: function (scope, element, attrs) {

            // returns an array with the range of numbers
            // you can use _.range instead if you use underscore
            function range(from, to, step) {
                var array = [];
                while (from + step <= to)
                    array[array.length] = from += step;

                return array;
            }

            // prepare range options
            var from = scope.from || 0;
            var step = scope.step || 1;
            var to   = scope.to || attrs.ngRepeatRange;

            // get range of numbers, convert to the string and add ng-repeat
            var rangeString = range(from, to + 1, step).join(',');
            angular.element(element).attr('ng-repeat', 'n in [' + rangeString + ']');
            angular.element(element).removeAttr('ng-repeat-range');

            $compile(element)(scope);
        }
    };
}]);
Run Code Online (Sandbox Code Playgroud)

和HTML代码是

<div ng-repeat-range from="0" to="20" step="5">
    Hello 4 times!
</div>
Run Code Online (Sandbox Code Playgroud)

或者干脆

<div ng-repeat-range from="5" to="10">
    Hello 5 times!
</div>
Run Code Online (Sandbox Code Playgroud)

甚至简单地说

<div ng-repeat-range to="3">
    Hello 3 times!
</div>
Run Code Online (Sandbox Code Playgroud)

要不就

<div ng-repeat-range="7">
    Hello 7 times!
</div>
Run Code Online (Sandbox Code Playgroud)


Vin*_*nce 9

最简单的没有代码解决方案是使用范围初始化一个数组,并使用$ index +但是我希望通过以下方式来补偿:

<select ng-init="(_Array = []).length = 5;">
    <option ng-repeat="i in _Array track by $index">{{$index+5}}</option>
</select>
Run Code Online (Sandbox Code Playgroud)


Mat*_*dic 7

方法定义

下面的代码定义了range()可用于整个应用程序范围的方法MyApp.它的行为与Python range()方法非常相似.

angular.module('MyApp').run(['$rootScope', function($rootScope) {
    $rootScope.range = function(min, max, step) {
        // parameters validation for method overloading
        if (max == undefined) {
            max = min;
            min = 0;
        }
        step = Math.abs(step) || 1;
        if (min > max) {
            step = -step;
        }
        // building the array
        var output = [];
        for (var value=min; value<max; value+=step) {
            output.push(value);
        }
        // returning the generated array
        return output;
    };
}]);
Run Code Online (Sandbox Code Playgroud)

用法

有一个参数:

<span ng-repeat="i in range(3)">{{ i }}, </span>
Run Code Online (Sandbox Code Playgroud)

0, 1, 2,

有两个参数:

<span ng-repeat="i in range(1, 5)">{{ i }}, </span>
Run Code Online (Sandbox Code Playgroud)

1, 2, 3, 4,

有三个参数:

<span ng-repeat="i in range(-2, .7, .5)">{{ i }}, </span>
Run Code Online (Sandbox Code Playgroud)

-2, -1.5, -1, -0.5, 0, 0.5,


a8m*_*a8m 6

你可以在angular.filter模块中使用'after'或'before'过滤器(https://github.com/a8m/angular-filter)

$scope.list = [1,2,3,4,5,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)

HTML:

<li ng-repeat="i in list | after:4">
  {{ i }}
</li>
Run Code Online (Sandbox Code Playgroud)

结果: 5,6,7,8,9,10


小智 6

无需对控制器进行任何更改,您可以使用以下命令:

ng-repeat="_ in ((_ = []) && (_.length=51) && _) track by $index"
Run Code Online (Sandbox Code Playgroud)

请享用!