AngularJS For Loop with Numbers & Ranges
Angular在其HTML指令中使用数字为for循环提供了一些支持:
1 | do something |
但是,如果范围变量包含一个具有动态数字的范围,那么每次都需要创建一个空数组。
在控制器中
1 2 3 4 5 | var range = []; for(var i=0;i<total;i++) { range.push(i); } $scope.range = range; |
在HTML中
1 | do something |
这是可行的,但这是不必要的,因为我们在循环中根本不会使用范围数组。有人知道设置最小/最大值的范围或规则吗?
类似:
1 | do something |
我稍微修改了一下这个答案,想出了这个小提琴。
过滤器定义为:
1 2 3 4 5 6 7 8 9 10 11 12 | 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; }; }); |
重复使用如下:
1 | do something |
我想出了一个更简单的版本,用于创建两个定义的数字之间的范围,例如5到15
参见jfiddle上的演示
HTML:
1 2 3 4 5 6 7 | <ul> <li ng-repeat="n in range(5,15)">Number {{n}} </li> </ul> |
控制器:
1 2 3 4 5 6 7 8 | $scope.range = function(min, max, step) { step = step || 1; var input = []; for (var i = min; i <= max; i += step) { input.push(i); } return input; }; |
除了简单的javascript(您甚至不需要控制器):
1 | {{ $index }} |
模拟时非常有用
我想出了一个稍有不同的语法,它更适合我,并添加了一个可选的下限:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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; }; }); |
可以用作
1 | Do something 0..9: {{n}} |
或
1 | Do something 20..29: {{n}} |
对于那些刚接触安古拉的人。使用$index可以获得索引。
例如:
1 | do something number {{$index}} |
当您使用Gloopy的便捷过滤器时,打印:
做一些数字0
做一些数字1
做第二件事做第三件事做一些4号的事情做一些5号的事情做6号的事做一些7号的事情做一些8号的事情做9号事情
实现这一点的一个简单方法是使用underline.js的.range()方法。:)
http://underlinejs.org/范围
1 2 3 4 5 6 | // 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. {{ $index }}: {{ val }} |
我使用我的自定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /** * 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); } }; }]); |
HTML代码是
1 | Hello 4 times! |
或者简单地
1 | Hello 5 times! |
甚至简单
1 | Hello 3 times! |
或者只是
1 | Hello 7 times! |
最简单的无代码解决方案是初始化一个带有范围的数组,然后使用$index+,不管我想用什么来补偿:
1 2 3 | <select ng-init="(_Array = []).length = 5;"> <option ng-repeat="i in _Array track by $index">{{$index+5}}</option> </select> |
方法定义
下面的代码定义了一个方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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; }; }]); |
用法
有一个参数:
1 | <span ng-repeat="i in range(3)">{{ i }}, </span> |
有两个参数:
1 | <span ng-repeat="i in range(1, 5)">{{ i }}, </span> |
有三个参数:
1 | <span ng-repeat="i in range(-2, .7, .5)">{{ i }}, </span> |
您可以在angular.filter模块中使用"after"或"before"过滤器(https://github.com/a8m/angular-filter)
1 | $scope.list = [1,2,3,4,5,6,7,8,9,10] |
HTML:
1 2 3 4 | <li ng-repeat="i in list | after:4"> {{ i }} </li> |
结果:5、6、7、8、9、10
在控制器没有任何变化的情况下,您可以使用:
1 | ng-repeat="_ in ((_ = []) && (_.length=51) && _) track by $index" |
享受!
最短答案:2行代码
JS(在AngularJS控制器中)
1 | $scope.range = new Array(MAX_REPEATS); // MAX_REPEATS should be the most repetitions you will ever need in a single ng-repeat |
HTML
1 |
…其中
您可以使用
1 | {{ ($index + 1) * 0.5 }} |
嗨,您可以使用纯HTML使用AngularJS来实现这一点(不需要任何指令!)
1 2 3 4 5 6 7 8 9 | 0" ng-repeat="i in x"> <!-- this content will repeat for 5 times. --> <table class="table table-striped"> <tr ng-repeat="person in people"> <td>{{ person.first + ' ' + person.last }}</td> </tr> </table> <p ng-init="x.push(i-1)"> </p> |
非常简单的一个:
1 2 3 4 5 | $scope.totalPages = new Array(10); {{$index+1}} |
使用下划线:
1 2 | angular.module('myModule') .run(['$rootScope', function($rootScope) { $rootScope.range = _.range; }]); |
将此应用于
1 | {{x}} |
在控制器中设置范围
1 2 3 4 5 | var range = []; for(var i=20;i<=70;i++) { range.push(i); } $scope.driverAges = range; |
在HTML模板文件中设置重复
1 2 3 | <select type="text" class="form-control" name="driver_age" id="driver_age"> <option ng-repeat="age in driverAges" value="{{age}}">{{age}}</option> </select> |
我尝试了以下方法,但效果很好:
1 | <md-radio-button ng-repeat="position in formInput.arrayOfChoices.slice(0,6)" value="{{position}}">{{position}}</md-radio-button> |
角度1.3.6
参加聚会迟到了。但我最终还是这样做了:
在控制器中:
1 2 3 4 5 6 7 | $scope.repeater = function (range) { var arr = []; for (var i = 0; i < range; i++) { arr.push(i); } return arr; } |
Html:
1 2 3 4 | <select ng-model="myRange"> <option>3</option> <option>5</option> </select> |
这是JZM改进的答案(我不能评论,否则我会评论她/他的答案,因为他/她包含错误)。函数有一个开始/结束范围值,所以它更灵活,而且…它起作用了。本案例适用于每月的某一天:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $scope.rangeCreator = function (minVal, maxVal) { var arr = []; for (var i = minVal; i <= maxVal; i++) { arr.push(i); } return arr; }; <select ng-model="monthDays"> <option ng-repeat="day in rangeCreator(1,31)">{{day}}</option> </select> |
对@mormegil解决方案的改进
1 2 3 4 5 6 7 8 9 10 11 | app.filter('makeRange', function() { return function(inp) { var range = [+inp[1] && +inp[0] || 0, +inp[1] || +inp[0]]; var min = Math.min(range[0], range[1]); var max = Math.max(range[0], range[1]); var result = []; for (var i = min; i <= max; i++) result.push(i); if (range[0] > range[1]) result.reverse(); return result; }; }); |
使用
1 | <span ng-repeat="n in [3, -3] | makeRange" ng-bind="n"></span> |
3 2 1 0-1-2-3
1 | <span ng-repeat="n in [-3, 3] | makeRange" ng-bind="n"></span> |
-3-2-1 0 1 2 3
1 | <span ng-repeat="n in [3] | makeRange" ng-bind="n"></span> |
0 1 2 2
1 | <span ng-repeat="n in [-3] | makeRange" ng-bind="n"></span> |
0—1—2—3
我突然想起这个,发现它可能对某些人有用。(是的,咖啡描述。告我。
指令1 2 3 4 5 6 7 | app.directive 'times', -> link: (scope, element, attrs) -> repeater = element.html() scope.$watch attrs.times, (value) -> element.html '' return unless value? element.html Array(value + 1).join(repeater) |
使用:
HTML1 | <i class="icon-picture> |
这能简单点吗?
我对过滤器很谨慎,因为Angular喜欢无缘无故地重新评估它们,如果像我一样有成千上万的过滤器,这是一个巨大的瓶颈。
这个指令甚至会监视模型中的更改,并相应地更新元素。
1 2 3 | <div ng-repeat='data in avatars' ng-if="avatars.length < 10 || flag" ng-init="avatars.length != 10 ? avatars.push({id : $index+1}) : ''; flag = avatars.length <= 10 ? true : false"> <img ng-src="http://actual-names.com/wp-content/uploads/2016/01/sanskrit-baby-girl-names-400x275.jpg"> |
如果您想在没有任何控制器或工厂的HTML中实现这一点。
这是最简单的变体:只需使用整数数组….
1 2 | <li ng-repeat="n in [1,2,3,4,5]">test {{n}} </li> |