Angularjs 初始化变量一次,以防止;10$digest()迭代次数已达到“;

Angularjs 初始化变量一次,以防止;10$digest()迭代次数已达到“;,angularjs,Angularjs,我正在对控制器中声明的函数返回的列表执行ng重复,并收到“10$digest()迭代已达到。正在中止!”消息 我发现问题在于调用了几次$scope.list()函数,每次调用该函数时,都会重新分配本地list变量,以便angular每次都能看到不同的对象,并重新绘制ngRepeat元素。如何避免这种情况?我以前没有想过,但我在函数外部声明了list后解决了这个问题,现在函数中返回的元素始终保持相同的引用 MyCtrl = ($scope)-> ... list = {}

我正在对控制器中声明的函数返回的列表执行ng重复,并收到“10$digest()迭代已达到。正在中止!”消息


我发现问题在于调用了几次
$scope.list()
函数,每次调用该函数时,都会重新分配本地
list
变量,以便angular每次都能看到不同的对象,并重新绘制ngRepeat元素。如何避免这种情况?

我以前没有想过,但我在函数外部声明了
list
后解决了这个问题,现在函数中返回的元素始终保持相同的引用

MyCtrl = ($scope)->
    ...
    list = {}
    $scope.list = ->
        for e in someArray
            ....    #adding stuff to list
        list
    ...
我仍然不喜欢我的解决方案,我想知道是否还有其他方法…

我还想知道这个函数是否可以只调用一次或几次。在调试过程中,我看到函数多次被调用,就像在作用域中发生变化时一样。如果
someArray
很大,或者如果函数内部的处理速度较慢,则重复调用似乎是一种开销。

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

函数MyCtrl($scope){
函数makeList(){
var列表=[];
//执行一些逻辑来生成一个列表
退货清单;
};
$scope.list=makeList();
}


如果需要直接调用scope方法,请确保这些方法是幂等的。

谢谢,我看到了问题所在。
MyCtrl = ($scope)->
    ...
    $scope.list = ->
        list = {}
        for e in someArray
            ....    #adding stuff to list
        list
    ...
MyCtrl = ($scope)->
    ...
    list = {}
    $scope.list = ->
        for e in someArray
            ....    #adding stuff to list
        list
    ...