AngularJS track by $index引起的思考
今天写了一段程序,只是一个简答的table数据绑定,但是绑定select的数据之后,发现ng-change事件失去了效果,不知道什么原因。
主要用到的代码如下:
<div id="right" ng-app="myApp" ng-controller="targetControl">
<select ng-model="indexSelect" data-size="4" ng-option="s for s in indexs track by $index"
id="stIndex" class = "selectpicker show-trick form-controller" ng-change="onIndexChanged()">
</select>
<table>
<tr>
<th>版本名称</th>
<th>达标值</th>
</tr>
<tr ng-repeat="x in lists track by $index">
<td>{{x.CVersion}}</td>
<td contenteditable = "true" ng-blur="submit($event)" title='{{x.duName}}'>{{x.TargetVal}}</td>
</tr>
</table>
</div>
<script type="text/javascript">
angular.module("myApp",[]);
angular.module("myApp").controller("targetControl",function($scope,$http){
$http({
url:*******,
method:"Get"
}).success(function(data)
{
$scope.index = data;
}).error(function(data))
{
alert("error");
};
$scope.onIndexChanged()
{
alert($("#stIndex option:selected").text());
};
//当达标值那一列值发生变化时,响应该事件
$scope.submit = function(obj)
{
//obj.target可以获取到当前td对象的所有属性,例如obj.target.title
}
});
</script>
刚开始调试的时候,是报了一个错:
Error:[ngRepeat:dupes] http://******
调查发现,是因为indexs里有重复数据导致的;
好像是只有有一项有重复数据就会报错(我测试的时候,仅达标值这一些列有重复元素),必须加上track by $index才行。
加上track by $index相当于给重复数据加上了序号,重复的数据就相当于不重复了。
然后我在给select标签去重的时候,也加上了track by $index,结果发现加上之后:
1、select的重复元素并没有去除;
2、无论选择select的哪个值,ng-change事件只能触发一次,后面都不能触发了;
3、select选项默认选中租最后一项,及时设置另一项为selected状态都没用。
经过调查后发现,track by $index对select标签去重并没有什么作用,而且select标签有重复数据时也不会报错。
ng-change事件不触发的原因是,加上track by $index之后,ng-model的值不会再发生变化,永远等于select标签的最后一个值,
看起来就像ng-change方法没有触发的样子。
select标签去除重复有另一种过滤机制:
app.filter('unique',function(){
return function(collection, keyname){
var output = [];
keys = [];
angular.forEach(collection, function(item){
var key = item[keyname];
if(keys.indexof(key) === -1){
keys.push(key);
output.push(item);
}
});
return output;
}
})
<div ng-repeat="item in items | unique:'id'"></div>
初步记录在此,后续再分析具体原因。
AngularJS track by $index引起的思考的更多相关文章
- angularJS ng-repeat="item in XXX track by $index"问题记录
参考:https://blog.csdn.net/lunhui1994_/article/details/80236315 问题:项目中对数据做了分页效果,理想是:当页数大于6时,隐藏>6的页数 ...
- ng-repeat 中的 track by $index
用ng-repeat指令遍历一个javascript数组,当数组中有重复元素的时候,angularjs会报错,这是因为ng-Repeat不允许collection中存在两个相同Id的对象. 对于数字或 ...
- angular ng-repeat点击切换样式,浅谈track by $index
前言 angular ng-repeat点击切换样式,ng-repeat点击切换class样式,巧用ng-repeat track by $index. 1.问题 一个ul包含多个li,li通过ng- ...
- 在angular中使用ng-repeat时数组中有重复元素,要用item in items track by $index
在angular中使用ng-repeat时数组中有重复元素,要用item in items track by $index,不然会报错 <div class="" ng-in ...
- 为Angularjs ngOptions加上index解决方案
今天在Angularjs交流群中有位童学问道如何为Angular select的ngOptions像Angularjs的ngRepeat一样加上一个索引$index. 其实对于这个问题来说Angula ...
- angular track by $index
这个东西配合删除数组时会出现永远删除uoloadPicArr这个数组的最后一个一项 其用法是主要用在当ng-repeat循环时如果其内部的dom元素有id属性存在 可以避免页面出现相同的id 只是一 ...
- AngularJs使用过程中,在ng-repeat中使用track by
1.问题描述: 点击删除后:table中的被选中设备确实被删除了,但是data-table并没有重新加载出来, 查看js代码: 先对$scope.data_table进行了destroy(),然后重新 ...
- 转:在使用angularjs过程,ng-repeat中track by的作用
转载:链接 <div ng-repeat="links in slides"> <div ng-repeat="link in links track ...
- 摆脱DOM操作,从TodoMVC看angularJS
取代jQuery? 我很久之前便听说了angularJS的大名,之前的leader也经常感叹angularJS的设计如何如何精妙,可叹一直没有机会深入了解,国庆长假因为没钱出游,倒是可以对他做一个了解 ...
随机推荐
- python 中 time 模块 格式化 format
%y 两位数的年份表示(00-99)%Y 四位数的年份表示(000-9999)%m 月份(01-12)%d 月内中的一天(0-31)%H 24小时制小时数(0-23)%I 12小时制小时数(01-12 ...
- [4X]荣耀畅玩4X开箱实录
http://www.jianshu.com/p/8d171c389ee8 文字都在简书里面啦~~
- [Boost]图形处理库Boost::Polygon
Background 工作中经师傅指导学习应用到了Boost::Polygon这个库,相对于Boost::Geometry,Polygon出自Intel.抽象于芯片流程,于是更贴近于芯片设计流程应用. ...
- gnome设置dvorak键盘布局
若桌面环境为gnome,设置Dvorak键盘程序员布局很简单.系统设置 -> 键盘 -> 布局设置 -> 点击"+" ->选择"英语(适合程序员的 ...
- SSH整合逻辑图
Struts,Spring,Hibernate三大框架的整合过多次,但自己理解的结合大师讲的对比起来,感觉还是有不少的差距. Struts,开发Web层框架,提供整洁的MVC结构,分离了各层关注,降低 ...
- PC-全国的 DNS服务商
我们请选第2个.然后根据自己的省市来填写..我复制了下版主给的网站 北京:202.96.199.133 202.96.0.133 202.106.0.20 202.106.148.1 202.97.1 ...
- 399. Evaluate Division
图像题,没觉得有什么简单的办法,貌似可以用Union Find来解. 感觉有2种思路,一种是先全部构建好每2个点的weight,然后直接遍历queires[][]来抓取答案. 一种是只构建简单的关系图 ...
- php获取机器网卡的物理(MAC)地址
<?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $return_array = ...
- ASP.NET MVC- Controllers and Routing- Controller Overview
In this tutorial, Stephen Walther introduces you to ASP.NET MVC controllers. You learn how to create ...
- FZU2138-久违的月赛之一
Problem Description 好久没举月赛了,这次lqw给大家出了5道题,因为hsy学长宣传的很到位,吸引了n个DDMM们来做,另一位kk学长说,全做对的要给金奖,做对4题要给银奖,做对3题 ...