'跟踪'在AngularJS中导致" 10 $ digest()interations"错误

时间:2015-12-09 05:35:47

标签: angularjs

在阅读了关于SO的其他几个问题之后,我仍然想知道为什么使用'跟踪'在我的Angular应用程序中导致事物陷入困境并显示10 $ digest()迭代错误。

我使用内部API检索用户列表(~1000,我知道我不应该同时抓取所有用户,但这是一个PoC应用程序)。返回的数据如下所示:

[
    { FirstName: "John", LastName: "Smith", Login: "SMITJOH1" }, 
    { FirstName: "Jane", LastName: "Citizen", Login: "CITIJAN1" },
    { ... }
]

Login始终是唯一的,因此将其用作跟踪器是有意义的。

我的控制器看起来像这样:

idfixerApp.controller('addController', function($scope, $http, $route, $rootScope) {

  $scope.loadUsers = function() {
      $http.get("/users/all").success(function(data) {
        $scope.users = data
        $scope.selected = $scope.users[0]
      })
  }

  $scope.orderBy = 'LastName';
  $scope.loadUsers()

})

我的观点如下:

<div ng-controller="addController" id="addController">
    <input ng-model="query">
    <select ng-model="orderBy">
          <option value="LastName">Last Name</option>
          <option value="FirstName">First Name</option>
    </select>
    <select ng-options="user as (user.LastName | uppercase) + ', ' + user.FirstName for user in users track by user.Login | filter:query | orderBy:orderBy" ng-model="selected" size="20"></select>
</div>

如果我不使用track by,我可以快速过滤和排序,但是一旦我添加track by user.Login,我就会开始收到$ digest()错误,整个页面变慢爬行。

由于我只抓取一次API数据(我添加了console.log以确保)并且由于user.Login永远不会改变,所以我对为什么{{感到困惑1}}导致我的应用程序停止运行。

解释会很精彩!

1 个答案:

答案 0 :(得分:2)

来自docs

  

注意:track by必须始终是最后一个表达式

尝试在过滤器和orderBy表达式之后将其移动到ng-repeat语句的末尾。