欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

angular track by $index 有大用


angular中ng-repeat的track by 的使用($index)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lunhui1994_/article/details/80236315

在angular中使用ng-repeat时数组中有重复元素

  • 当我们在循环的数组中存在有重复的元素时候,angular的ng-repeat就会报错,那是因为其不允许collection有相同的id(相同的元素会形成相同的id)出现。而基本的数据类型它的id就是它自身的值。

  • 我们要避免这种情况通常会使用track by $index 来让其生成自己不同的id,这样是最常用的直接通过索引来生成id。我们也可以通过自己设置业务上的id,然后用其进行遍历track by item.id.

  • 总结一下,解决重复问题的方法就是item in items track by $index

使用$index会出现的问题。

  • 我们使用$index不仅仅是为了避免重复元素的问题,有时候会被使用$index的索引来进行一部分操作,这里有一个坑需要注意。

当我们使用$index的时候,下列情况会出现$index跟原序列不匹配的情况

  1. 当我们改变列表的顺序的时候

  2. 当我们在列表中插入或者删除的时候


  • 由于$index会跟随item上移下移,或者随之被删除。(例如你把列表第二条和第一条位置互换,这时候列表现在第一条的$index依旧为2,第二条还是原来的1)这时候你再使用$index传值就不在是新数组的索引了,不再匹配。

所以使用$index的时候要特别注意这些问题


来自 https://blog.csdn.net/lunhui1994_/article/details/80236315





在使用angularjs过程,ng-repeat中track by的作用

转载:http://segmentfault.com/q/1010000000405730
<div ng-repeat="links in slides">
  1. <div ng-repeat="link in links track by $index">{{link.name}}</div>
  2. </div>

Error: [ngRepeat:dupes]这个出错提示具体到题主的情况,意思是指数组中有2个以上的相同数字。ngRepeat不允许collection中存在两个相同Id的对象

For example: item in items is equivalent to item in items track by $id(item). This implies that the DOM elements will be associated by item identity in the array.

对于数字对象来说,它的id就是它自身的值,因此,数组中是不允许存在两个相同的数字的。为了规避这个错误,需要定义自己的track by表达式。例如:item in items track by item.id或者item in items track by fnCustomId(item)。嫌麻烦的话,直接拿循环的索引变量$index来用item in items track by $index

来自  https://blog.csdn.net/rangqiwei/article/details/38020667





使用angular中ng-repeat , track by的用处

 我们见到最简单的例子是:

1
<div   ng-repeat="link in links" ></div>

  

如果item的值有重复的,比如links=["1","1","2","2","3"]

那么angularjs 会报错,不允许值重复,原因是angular需要一个唯一值可以与生成的dom绑定,以便追踪.

然后这时候,track by的用处就体现出来了。

1
<div ng-repeat="(key,value) in links track by key"></div>

  key值是唯一的,这样就解决了

来自  https://www.cnblogs.com/fangshidaima/p/5882355.html

angular track by $index

这个东西配合删除数组时会出现永远删除uoloadPicArr这个数组的最后一个一项  

其用法是主要用在当ng-repeat循环时如果其内部的dom元素有id属性存在 可以避免页面出现相同的id  只是一种用法而已 没什么必要的 可以解决控制台的报错 

 

来自 https://www.cnblogs.com/mamimi/p/7732220.html



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>

 

 

初步记录在此,后续再分析具体原因。

 

来自 https://www.cnblogs.com/wanggang2016/p/6031936.html



普通分类: