ngRepeat

ng-repeat 是 Angular 中的内置指令,它允许你迭代数组或对象,并使你能够为集合中的每个项重复一次元素。

ng-重复一个数组

<ul>
    <li ng-repeat="item in itemCollection">
       {{item.Name}}
    </li>
</ul>

其中:
item =集合中的单个项
itemCollection =你正在迭代的数组

ng-重复一个对象

<ul>
    <li ng-repeat="(key, value) in myObject">
       {{key}} : {{value}}
    </li>
</ul>

其中:
key =属性名称
value =属性
myObject =你正在迭代的对象的值

通过用户输入过滤 ng-repeat

<input type="text" ng-model="searchText">
<ul>
    <li ng-repeat="string in stringArray | filter:searchText">
       {{string}}
    </li>
</ul>

其中:
searchText =用户希望通过
stringArray 过滤列表的文本 =字符串数组,例如 ['string', 'array']

你还可以通过为过滤器输出为 as aliasName 指定别名来显示或引用过滤后的项目,如下所示:

<input type="text" ng-model="searchText">
<ul>
    <li ng-repeat="string in stringArray | filter:searchText as filteredStrings">
       {{string}}
    </li>
</ul>
<p>There are {{filteredStrings.length}} matching results</p>

ng-repeat-start 和 ng-repeat-end

要通过定义起点和终点重复多个 DOM 元素,可以使用 ng-repeat-startng-repeat-end 指令。

<ul>
    <li ng-repeat-start="item in [{a: 1, b: 2}, {a: 3, b:4}]">
        {{item.a}}
    </li>
    <li ng-repeat-end>
        {{item.b}}
    </li>
</ul>

输出:

  • 1
  • 2
  • 3
  • 4

始终用 ng-repeat-end 关闭 ng-repeat-start 非常重要。

变量

ng-repeat 还在表达式中公开这些变量

变量 类型 细节
$index 等于当前迭代的索引($ index === 0 将在第一个迭代元素处求值为 true;请参阅 $first
$first 布尔 在第一个迭代元素处求值为 true
$last 布尔 在最后一个迭代元素处求值为 true
$middle 布尔 如果元素位于 $first$last 之间,则求值为 true
$even 布尔 在偶数迭代中求值为 true(相当于 $index%2===0
$odd 布尔 在奇数迭代处求值为 true(相当于 $index%2===1

性能考虑因素

渲染 ngRepeat 会变慢,尤其是在使用大型集合时。

如果集合中的对象具有标识符属性,则应始终使用标识符而不是整个对象,这是默认功能。如果没有标识符,你可以随时使用内置的 $index

<div ng-repeat="item in itemCollection track by item.id">
<div ng-repeat="item in itemCollection track by $index">

ngRepeat 的范围

ngRepeat 将始终创建一个独立的子范围,因此如果需要在重复内部访问父范围,则必须小心。

这是一个简单的示例,显示如何在 ngRepeat 内的单击事件中设置父作用域中的值。

scope val:  {{val}}<br/>
ctrlAs val: {{ctrl.val}}
<ul>
    <li ng-repeat="item in itemCollection">
        <a href="#" ng-click="$parent.val=item.value; ctrl.val=item.value;">
            {{item.label}} {{item.value}}
        </a>
    </li>
</ul>

$scope.val = 0;
this.val = 0;

$scope.itemCollection = [{
    id: 0,
    value: 4.99,
    label: 'Football'
},
{
    id: 1,
    value: 6.99,
    label: 'Baseball'
},
{
    id: 2,
    value: 9.99,
    label: 'Basketball'
}];

如果在 ng-click 只有 val = item.value,它将不会更新父范围内的 val,因为隔离范围。这就是使用 $parent 引用或 controllerAs 语法(例如 ng-controller="mainController as ctrl")访问父作用域的原因。

嵌套的 ng-repeat

你也可以使用嵌套的 ng-repeat。

<div ng-repeat="values in test">
    <div ng-repeat="i in values">
      [{{$parent.$index}},{{$index}}] {{i}}
    </div>
</div>

var app = angular.module("myApp", []);
app.controller("ctrl", function($scope) {
  $scope.test = [
    ['a', 'b', 'c'],
    ['d', 'e', 'f']
  ];
});

在这里访问子 ng-repeat 里面的父 ng-repeat 索引,你可以使用 $parent.$index