angularjs指令:$ rootScope:infdig错误

Hor*_*ren 14 angularjs angularjs-directive

我正在尝试使用angularjs 1.2.15构建一个分页指令:

这是我的看法:

<input type="text" ng-model="filter.user">
<input type="number" ng-model="filter.limit" ng-init="filter.limit=5">
<ul>
  <li ng-repeat="user in (filteredUsers = (users | orderBy:order:reverse | filter:filter.user ) | limitTo: filter.limit)" ng-click="showDetails(user)">
    {{user.id}} / {{user.firstname}} {{user.lastname}}
  </li>
</ul>
<div pagination data='filteredUsers' limit='filter.limit'></div>
Run Code Online (Sandbox Code Playgroud)

这是我的分页指令:

app.directive('pagination', function(){
  return {
    restrict: 'A',
    templateUrl: 'partials/pagination.html',
    scope: {
      data: '=data',
      limit: '=limit'
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

没有分页指令,一切都很完美.但是,一旦我加载页面,我的新指令就会$rootScope:infdig出现一个我不明白的错误,因为该指令没有做任何事情来操纵可能最终无限循环的数据.
这里有什么问题,我该如何解决?谢谢!

更新:
这是控制器和资源.
控制器:

usersModule.controller('usersController',
  function ($scope, Users) {
    function init(){
      $scope.users = Users.get();
    }
    init();
})
Run Code Online (Sandbox Code Playgroud)

资源(从REST API获取用户数组):

app.factory('Users', function($resource) {
  return $resource('http://myrestapi.tld/users', null,{
       'get': { method:'GET', isArray: true, cache: true }
   });
});
Run Code Online (Sandbox Code Playgroud)

更新2

这是一个演示:http://plnkr.co/edit/9GCE3Kzf21a7l10GFPmy?p=preview
只需在左侧输入中输入一个字母(例如"f").

Bar*_*ash 31

问题不在指令范围内,而是在指令创建的$ watch内.将filteredUsers发送到指令时,该指令将创建以下行:

$scope.$watch("filteredUsers", function() {
    // Directive Code...
});
Run Code Online (Sandbox Code Playgroud)

请注意以下示例中我们如何在没有指令的情况下重现它:http: //plnkr.co/edit/uRj19PyXkvnLNyh5iY0j

它发生的原因是因为每次运行摘要时都会更改filteredUsers(因为您将赋值放在ng-repeat语句中).

要解决此问题,您可以考虑使用$ watch的额外参数'true'来监视和过滤控制器中的数组:

$scope.$watch("users | orderBy:order:reverse | filter:filter.user", function(newVal) {
    $scope.filteredUsers = newVal;
}, true);
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看解决方案:http: //plnkr.co/edit/stxqBtzLsGEXmsrv3Gp6

没有额外参数的$ watch(true)将对该对象进行简单的比较,并且由于您在每个摘要循环中创建一个新数组,因此该对象将始终不同.当您将true参数传递给$ watch函数时,这意味着它将实际与再次运行$ watch之前返回的对象进行深度比较,因此即使您有不同的数组实例具有相同的数据,它也会认为他们是平等的