angularjs ng-repeat

要循环的数据

$scope.friends = [
    {name:'John',age:25,gender:'boy'},{name:'Jessie',age:30,gender:'girl'},{name:'Johanna',age:28,{name:'Joy',age:15,{name:'Mary',{name:'Peter',age:95,{name:'Sebastian',age:50,{name:'Erika',age:27,{name:'Patrick',age:40,{name:'Samantha',age:60,gender:'girl'}
  ];

一,定义和用法

ng-repeat 指令用于循环输出指定次数的 HTML 元素。
集合必须是数组或对象。

二,语法和参数值

1,语法

<element ng-repeat="expression"></element>

所有的 HTML 元素都支持该指令。

2,参数值

(1),expression为数组循环:x in records

使用数组循环输出一个表格:

<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>

(2),expression为对象循环:(key,value) in myObj

使用对象循环输出一个表格:

<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",function($scope) { $scope.myObj = { "Name" : "Alfreds Futterkiste","Country" : "Germany","City" : "Berlin" } }); </script>

(3),其他参数值

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慢。

item in items track by $index
按索引变量$index循环

三,ng-repeat和(ng-repeat-start,ng-repeat-end)

ng-repeat和(ng-repeat-start,ng-repeat-end)都是循环一个items, 区别是ng-repeat-start,ng-repeat-end可以跨越多个标签, 而ng-repeat只能在一个标签里面循环!

 <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里面提供了几个变量,为开发者提供一些快捷的操作,

$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://www.jb51.cc/article/p-kptdewku-bme.html

3,track by 一定要放在orderBy之后,否则会影响orderBy的效果

参考文章

https://docs.angularjs.org/api/ng/directive/ngRepeat
http://www.tuicool.com/articles/Z3eiQz

demo

http://download.csdn.net/detail/superjunjin/9710594

相关文章

ANGULAR.JS:NG-SELECTANDNG-OPTIONSPS:其实看英文文档比看中...
AngularJS中使用Chart.js制折线图与饼图实例  Chart.js 是...
IE浏览器兼容性后续前言 继续尝试解决IE浏览器兼容性问题,...
Angular实现下拉菜单多选写这篇文章时,引用文章地址如下:h...
在AngularJS应用中集成科大讯飞语音输入功能前言 根据项目...
Angular数据更新不及时问题探讨前言 在修复控制角标正确变...