是否有一种方法可以ng-repeat定义的次数,而不是总是要迭代一个数组?
例如,下面我希望列表项显示5次,假设为$scope。数字等于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>
更新(9/25/2018)
新版本的AngularJS(>= 1.3.0)允许你只需要一个变量就可以做到这一点(不需要函数):
<li ng-repeat="x in [].constructor(number) track by $index">
<span>{{ $index+1 }}</span>
</li>
$scope.number = 5;
在第一次提出这个问题时,这是不可能的。感谢@Nikhil Nambiar在下面的回答
原始(5/29/2013)
目前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。任意编号,仍然保持您正在寻找的绑定。
编辑(1/6/2014)——AngularJS(>= 1.1.5)的新版本要求通过$index跟踪:
<li ng-repeat="i in getNumber(number) track by $index">
<span>{{ $index+1 }}</span>
</li>
这里使用相同的getNumber函数对两个列表进行了修改。
我也遇到过同样的问题,这就是我得出的结论:
(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>
生活的例子
我使用了下划线的时间函数,因为我们已经在项目中使用它,但你可以很容易地用本地代码替换它。
对于使用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>