Angular如何初始化更新变量,实现ng-repeat条件渲染前2条学生数据
问题原因
你遇到的问题本质是AngularJS的作用域继承问题:ng-repeat的每一个迭代项都会创建独立的子作用域,你在父级通过ng-init="x=1"定义的x是基本数据类型,子作用域中执行x++时会直接在子作用域创建一个同名的局部变量x,并不会修改父作用域的x值,所以每次判断x<3时拿到的都是父作用域未被修改的初始值1,导致所有符合Student类型的条目都被渲染。
推荐解决方案(最佳实践)
直接在ng-repeat中使用AngularJS内置的filter和limitTo过滤器,先筛选符合条件的条目再截断指定数量,完全不需要额外定义计数变量,逻辑更清晰:
模板代码
<div> <p> These are my names.... </p> <div ng-repeat="a in data.result | filter:{type:'Student'} | limitTo:2"> <span> <br/> {{::a.name}} with type of {{::a.type}} and color {{::a.color}} </span> </div> </div>
说明
filter:{type:'Student'}:先从data.result里筛选所有type为Student的条目limitTo:2:取筛选后结果的前2条- 不需要额外的
ng-if和计数变量逻辑,性能更好也更易维护
备选方案(如需在模板内计数)
如果有特殊场景必须在模板内做计数判断,可以将计数变量绑定到父作用域的对象属性上,避免子作用域覆盖变量:
模板代码
<div ng-init="count = {student: 0}"> <p> These are my names.... </p> <div ng-repeat="a in data.result"> <div ng-if="a.type=='Student' && count.student < 2"> <span ng-init="count.student = count.student + 1"> <br/> {{::a.name}} with type of {{::a.type}} and color {{::a.color}} </span> </div> </div> </div>
说明
因为对象的属性会沿作用域链向上查找,子作用域修改count.student时不会创建新的局部变量,会直接修改父作用域的count对象属性,计数就可以正常生效。
内容的提问来源于stack exchange,提问作者IP-Sindhuria
相关产品推荐
相关产品推荐

