AngularJS ng-repeat如何默认跟踪项目?

时间:2014-10-30 12:27:16

标签: javascript angularjs angularjs-ng-repeat

我了解您可以使用track by expr来指定项目在ng-repeat指令中的键入方式。

但是没有track by,AngularJS如何识别项目?

我可以通过改变对象来控制对象的跟踪方式,而不使用track by吗?

来自文档:

  

如果未指定跟踪功能,则ng-repeat按照集合中的标识关联元素。

但目前尚不清楚。什么"集合中的身份"意思?

3 个答案:

答案 0 :(得分:3)

如果省略track by表达式,则默认情况下,角度将按$$hashkey跟踪,该值会自动按角度插入到对象列表中。 $$hashkey称为集合的身份

您可以在What is the $$hashKey added to my JSON.stringify result

找到更多信息

答案 1 :(得分:2)

如果对对象键执行重复,则跟踪标识符是键

e.g. ng-repeat="(key,value) in thingies"

对于数组,通过为每个数组项调用hashKey函数来确定跟踪标识符。 hashKey函数的注释表明了如何确定:

  • string is string
  • number是字符串数字
  • object是在对象上调用$$ hashKey函数或唯一生成的id
  • 的结果
  • 也分配给对象的$$ hashKey属性。

答案 2 :(得分:1)

如果没有轨道表达式,则会计算基于该值的哈希值。 使用轨道表达式,如果需要该级别的控制,可以提供自己的函数来计算哈希值。

<!DOCTYPE html>
<html>

  <head>
    <script data-require="angular.js@*" data-semver="1.3.0" src="//code.angularjs.org/1.3.0/angular.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>

  <body ng-controller="myCtrl">
    <h1>User Defined Indexer</h1>
    <ul>
      <li ng-repeat="item in data track by getTracker()">{{item}}</li>
    </ul>

    <script>
      var app=angular.module("app",[]);
      app.controller("myCtrl",function($scope){
        $scope.data=[1,2,3,4,5]
        $scope.getTracker = function(v){
          return Math.random();
        }
      });
      angular.bootstrap(document,["app"]);
    </script>

  </body>

</html>