3

我正在对控制器中声明的函数返回的列表执行 ng-repeat,我得到“达到 10 个 $digest() 迭代。中止!” 信息。

<div ng-repeat element in list()></div>

功能:

MyCtrl = ($scope)->
    ...
    $scope.list = ->
        list = {}
        for e in someArray
            ....    #adding stuff to list
        list
    ...

我发现问题是该$scope.list()函数被多次调用,并且每次调用该函数时list都会重新分配局部变量,因此 Angular 每次都会看到不同的对象,并且 ngRepeat 元素被重绘。我怎样才能避免这种情况?

4

2 回答 2

6

每个 $digest 至少评估 Angular 表达式两次,并且 $digest 一次可以运行 10 次(当绑定需要“刷新”时)。这意味着表达式将被重新评估多次。这是 Angular 的常见缺陷之一。因此,您需要确保不要直接在表达式中调用函数。相反,让函数在控制器内部执行一次,然后在表达式中使用函数结果:

function MyCtrl($scope){

  function makeList(){
    var list = [];
    // do some logic to generate a list
    return list;
  };

  $scope.list = makeList();
}
<div ng-repeat="element in list"></div>

如果您必须直接调用范围方法而不是确保这些方法是幂等的。

于 2013-07-02T16:28:00.440 回答
0

我之前没有考虑过这一点,但我list在函数外部声明解决了它,现在函数中返回的元素始终保持相同的引用。

MyCtrl = ($scope)->
    ...
    list = {}
    $scope.list = ->
        for e in someArray
            ....    #adding stuff to list
        list
    ...

我仍然不喜欢我的解决方案,我想知道是否还有其他方法......
我也想知道该函数是否可以只调用一次或几次。在调试时,我看到该函数被多次调用,就像范围发生变化时一样。如果someArray很大或者函数内部的处理速度很慢,那么这种重复调用似乎是一种开销。

于 2013-07-02T16:27:36.810 回答