AngularJS用数字和范围循环
Angular在其HTML指令中提供了一些使用数字的for循环的支持:
<div data-ng-repeat="i in [1,2,3,4,5]"> do something </div>
但是,如果您的范围变量包含具有动态数字的范围,则每次都需要创建一个空数组。
在控制器中
var range = []; for(var i=0;i<total;i++) { range.push(i); } $scope.range = range;
在HTML中
<div data-ng-repeat="i in range"> do something </div>
这是有效的,但这是没有必要的,因为我们不会在循环中使用范围数组。 有没有人知道设置范围或规则的最小/最大值?
就像是:
<div data-ng-repeat="i in 1 .. 100"> do something </div>
我调整了一下这个答案,并提出了这个小提琴 。
过滤器定义为:
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; }; });
重复使用像这样:
<div ng-repeat="n in [] | range:100"> do something </div>
我想出了一个更简单的版本,用于创建两个定义的数字之间的范围,例如。 5至15
在JSFiddle上查看演示
HTML :
<ul> <li ng-repeat="n in range(5,15)">Number {{n}}</li> </ul>
控制器 :
$scope.range = function(min, max, step) { step = step || 1; var input = []; for (var i = min; i <= max; i += step) { input.push(i); } return input; };
我想出了一个略微不同的语法,它适合我多一点,并添加一个可选的下限:
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; }; });
你可以使用它
<div ng-repeat="n in [10] | makeRange">Do something 0..9: {{n}}</div>
要么
<div ng-repeat="n in [20, 29] | makeRange">Do something 20..29: {{n}}</div>
只有简单的Javascript(你甚至不需要控制器):
<div ng-repeat="n in [].constructor(10) track by $index"> {{ $index }} </div>
模拟时非常有用
对于那些新的angularjs。 索引可以通过使用$ index来获得。
例如:
<div ng-repeat="n in [] | range:10"> do something number {{$index}} </div>
当你使用Gloopy的方便的过滤器时,会打印:
做一些数字0
做一些事情1号
做一些事情2号
做一些事情3号
做一些事情4号
做一些事情5号
做一些事情6号
做一些事情7号
做一些数字8
做点9号
这样做的一个简短的方法是使用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>
我使用我的自定义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); } }; }]);
和html代码是
<div ng-repeat-range from="0" to="20" step="5"> Hello 4 times! </div>
或干脆
<div ng-repeat-range from="5" to="10"> Hello 5 times! </div>
甚至简单地说
<div ng-repeat-range to="3"> Hello 3 times! </div>
要不就
<div ng-repeat-range="7"> Hello 7 times! </div>
最简单的没有代码解决方案是用范围初始化一个数组,并使用$ index +,但是我想抵消多少:
<select ng-init="(_Array = []).length = 5;"> <option ng-repeat="i in _Array track by $index">{{$index+5}}</option> </select>
您可以在angular.filter模块( https://github.com/a8m/angular-filter )中使用'after'或'before'
$scope.list = [1,2,3,4,5,6,7,8,9,10]
HTML:
<li ng-repeat="i in list | after:4"> {{ i }} </li>
结果: 5,6,7,8,9,10
方法定义
下面的代码定义了一个可用于应用程序MyApp
的整个范围的方法range()
。 它的行为与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; }; }]);
用法
有一个参数:
<span ng-repeat="for i in range(3)">{{ i }}, </span>
0, 1, 2,
有两个参数:
<span ng-repeat="for i in range(1, 5)">{{ i }}, </span>
1, 2, 3, 4,
有三个参数:
<span ng-repeat="for i in range(-2, .7, .5)">{{ i }}, </span>
-2, -1.5, -1, -0.5, 0, 0.5,
最短的答案:2行代码
JS(在你的AngularJS控制器中)
$scope.range = new Array(MAX_REPEATS); // MAX_REPEATS should be the most repetitions you will ever need in a single ng-repeat
HTML
<div data-ng-repeat="i in range.slice(0,myCount) track by $index"></div>
… myCount
是应该出现在这个位置的星星的数量。
您可以使用$index
进行任何跟踪操作。 例如,如果你想在索引上打印一些突变,你可以在div
加入以下内容:
{{ ($index + 1) * 0.5 }}
使用UnderscoreJS:
angular.module('myModule') .run(['$rootScope', function($rootScope) { $rootScope.range = _.range; }]);
将它应用到$rootScope
使其在任何地方都可用:
<div ng-repeat="x in range(1,10)"> {{x}} </div>
很简单的一个:
$scope.totalPages = new Array(10); <div id="pagination"> <a ng-repeat="i in totalPages track by $index"> {{$index+1}} </a> </div>
在控制器中设置范围
var range = []; for(var i=20;i<=70;i++) { range.push(i); } $scope.driverAges = range;
在HTML模板文件中设置重复
<select type="text" class="form-control" name="driver_age" id="driver_age"> <option ng-repeat="age in driverAges" value="{{age}}">{{age}}</option> </select>
对Mormegil解决方案的改进
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; }; });
用法
<span ng-repeat="n in [3, -3] | makeRange" ng-bind="n"></span>
3 2 1 0 -1 -2 -3
<span ng-repeat="n in [-3, 3] | makeRange" ng-bind="n"></span>
-3 -2 -1 0 1 2 3
<span ng-repeat="n in [3] | makeRange" ng-bind="n"></span>
0 1 2 3
<span ng-repeat="n in [-3] | makeRange" ng-bind="n"></span>
0 -1 -2 -3
我试了下面,它对我来说工作得很好:
<md-radio-button ng-repeat="position in formInput.arrayOfChoices.slice(0,6)" value="{{position}}">{{position}}</md-radio-button>
角1.3.6
这是jzm的改进的答案(我不能评论,否则我会评论她/他的答案,因为他/他包括错误)。 该函数有一个开始/结束范围值,所以它更灵活,而且…它的工作原理。 这个特殊情况是每个月中的一天:
$scope.rangeCreator = function (minVal, maxVal) { var arr = []; for (var i = minVal; i <= maxVal; i++) { arr.push(i); } return arr; }; <div class="col-sm-1"> <select ng-model="monthDays"> <option ng-repeat="day in rangeCreator(1,31)">{{day}}</option> </select> </div>
在你的控制器没有任何改变,你可以使用这个:
ng-repeat="_ in ((_ = []) && (_.length=51) && _) track by $index"
请享用!
嗨,你可以实现这一点使用AngularJS纯净的HTML(NO指令是必需的!)
<div ng-app="myapp" ng-controller="YourCtrl" ng-init="x=[5];"> <div ng-if="i>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> </div> </div>
我鞭打了这一点,看到它可能是有用的一些。 (是的,CoffeeScript。Sue我。)
指示
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)
使用:
HTML
<div times="customer.conversations_count"> <i class="icon-picture></i> </div>
这可以得到更简单吗?
我对过滤器很谨慎,因为Angular喜欢重新评估它们,没有任何理由,如果像我一样有成千上万的瓶颈,这是一个巨大的瓶颈。
该指令甚至会监视模型中的更改,并相应地更新元素。
晚会到了晚会 但我最终只是这样做:
在你的控制器中:
$scope.repeater = function (range) { var arr = []; for (var i = 0; i < range; i++) { arr.push(i); } return arr; }
HTML:
<select ng-model="myRange"> <option>3</option> <option>5</option> </select> <div ng-repeat="i in repeater(myRange)"></div>
<div ng-init="avatars = [{id : 0}]; flag = true "> <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"> </div> </div>
如果你想在没有任何控制器或工厂的HTML中实现这一点。
这是最简单的变体:只使用整数数组….
<li ng-repeat="n in [1,2,3,4,5]">test {{n}}</li>