为什么| sortBy:随机使用Angular 1.0.1而不是1.2.26?

时间:2015-10-01 11:24:06

标签: angularjs angularjs-ng-repeat

这个简单的随机函数曾经在Angular 1.0.1中运行良好:

http://jsfiddle.net/edwardtanguay/4af5Lr69/1/

但是当我加载Angular 1.2.26时,它会收到错误

  

错误:[$ rootScope:infdig] ...

<div ng-controller="MyCtrl">
    <p ng-repeat="i in list|orderBy:random">{{i}}</p>
</div>
var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {
    $scope.list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
    $scope.random = function() {
        return 0.5 - Math.random();
    }
}

我需要做些什么才能在Angular 1.2.26中使用它?

2 个答案:

答案 0 :(得分:1)

我不确定为什么它在早期版本中有效,但它现在不起作用的原因是摘要很复杂,单个范围更改可以生成大量摘要。从摘要中再次更改范围的任何内容都将生成新的摘要以协调范围更改。

考虑摘要不是一次性操作,它们是在所有手表被调和后停止的循环。

通过在视图中使用返回随机排序值的函数,它将为每个摘要返回一个新值,从而创建一个无限循环。

另请注意,使用angular(不是min版本)的开发版本将提供更详细的错误输出和堆栈跟踪

答案 1 :(得分:1)

错误是因为digest cycle连续执行了10次以上的迭代。

如果我们定义为<p ng-repeat="i in list| orderBy:random">{{i}}</p>,那么random()函数将调用每个重复以及之后。这是角度doc描述问题。

您可以使用类似下面的内容来增加摘要周期限制,但这将是性能问题。

var app = angular.module('app', [], function($rootScopeProvider) {
     $rootScopeProvider.digestTtl(10000);
});

这是DOC

如果您可以使用此类example之类的内容,请使用它。