要循环的数据javascript
$scope.friends = [ {name:'John', age:25, gender:'boy'}, {name:'Jessie', age:30, gender:'girl'}, {name:'Johanna', age:28, gender:'girl'}, {name:'Joy', age:15, gender:'girl'}, {name:'Mary', age:28, gender:'girl'}, {name:'Peter', age:95, gender:'boy'}, {name:'Sebastian', age:50, gender:'boy'}, {name:'Erika', age:27, gender:'girl'}, {name:'Patrick', age:40, gender:'boy'}, {name:'Samantha', age:60, gender:'girl'} ];
ng-repeat 指令用于循环输出指定次数的 HTML 元素。
集合必须是数组或对象。java
<element ng-repeat="expression"></element>
全部的 HTML 元素都支持该指令。react
使用数组循环输出一个表格:angularjs
<table ng-controller="myCtrl" border="1"> <tr ng-repeat="x in records"> <td>{{x.Name}}</td> <td>{{x.Country}}</td> </tr> </table> <script> var app = angular.module("myApp", []); app.controller("myCtrl", function($scope) { $scope.records = [ { "Name" : "Alfreds Futterkiste", "Country" : "Germany" },{ "Name" : "Berglunds snabbköp", "Country" : "Sweden" },{ "Name" : "Centro comercial Moctezuma", "Country" : "Mexico" },{ "Name" : "Ernst Handel", "Country" : "Austria" } ] }); </script>
使用对象循环输出一个表格:express
<table ng-controller="myCtrl" border="1"> <tr ng-repeat="(x, y) in myObj"> <td>{{x}}</td> <td>{{y}}</td> </tr> </table> <script> var app = angular.module("myApp", []); app.controller("myCtrl", function($scope) { $scope.myObj = { "Name" : "Alfreds Futterkiste", "Country" : "Germany", "City" : "Berlin" } }); </script>
item in items track by $id(item) 至关于 item in items
ng-repeat会为每个元素加上一个$$hashKey来识别每个元素,当咱们从后端从新获取数据时,即便数据彻底同样,可是因为hashKey不同,angular会删除以前的全部dom,从新生成新的dom。这样效率就会大大下降。能够理解为ng-repeat默认是 track by $hashKey的。因此,咱们应该使用一些不会变的东西来做为标识,好比后端数据的id.后端
item in items track by item.id
这样当从新获取数据时,因为id没有变,angular就不会去删除原来的dom,只会更新其中的内容,不一样的id再添加新的dom。效率就能提高了。这至关于react中data-reactid的功能,这样angular并不比react慢。api
item in items track by $index
按索引变量$index循环数组
ng-repeat和(ng-repeat-start,ng-repeat-end)都是循环一个items, 区别是ng-repeat-start,ng-repeat-end能够跨越多个标签, 而ng-repeat只能在一个标签里面循环!app
<header ng-repeat-start="friend in friends"> Header {{ friend.name }} </header> <div class="body"> Body {{ friend.age }} </div> <footer ng-repeat-end> Footer {{ friend.gender }} <hr> </footer>
ng-repeat里面提供了几个变量,为开发者提供一些快捷的操做,dom
$index: 表示当前item的索引,
$first:若是item为第一个,那么$first为true,
$middle:若是item不是开头,不是结尾,那么$middle为true,
$last:若是item为最后一个,那么$last为true,
$even:若是索引为偶数,那么$even为true,
$odd:若是索引为奇数,那么$odd为true
item in items | filter : x as results ,结果filter过滤后的 结果会被保存到results
I have {{friends.length}} friends. They are: <input type="search" ng-model="q" placeholder="filter friends..." /> <ul class="example-animate-container"> <li class="animate-repeat" ng-repeat="friend in friends | filter:q as results"> [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old. </li> <li class="animate-repeat" ng-if="results.length === 0"> <strong>No results found...</strong> </li> </ul>
1,若是要循环的数组是这样的$scope.dataList = [1,2,1];
会报错
Error: [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: user in users, Duplicate key: number:1。
这是由于ng-Repeat不容许collection中存在两个相同Id的对象。
对于数字或者字符串等基本数据类型来讲,它的id就是它自身的值。所以数组中是不容许存在两个相同的数字的。为了规避这个错误,须要定义本身的track by表达式。
若是是javascript对象类型数据,那么就算内容一摸同样,ng-repeat也不会认为这是相同的对象。
若是$scope.dataList = [{"age":10},{"age":10}];,那么是不会报错的。
2,慎用$index做为增删改查数据的依据,因为通过filter过滤后,index的值已经变化,会引发错误,最好直接取item对象去增删改查!
参考自:http://blog.csdn.net/renfufei...
3,track by 必定要放在orderBy以后,不然会影响orderBy的效果。
参考文章:
https://docs.angularjs.org/ap...
http://www.tuicool.com/articl...