【问题标题】:How to avoid Infinite $digest Loop error while working with ngResource使用 ngResource 时如何避免 Infinite $digest Loop 错误
【发布时间】:2014-02-25 19:04:02
【问题描述】:

我正在 $watching 我的指令中的 $scope.randomObjects。如果函数不稳定,$watch 会抛出错误,我认为我在 getDesiredAmountOfObjects 中的柯里化函数是幂等的。我看不到的 ngResource -objects 是否发生了什么? 我怎样才能解决这个问题?此外,desiredAmount 目前也是固定的。

这是来自我的控制器的 sn-p:

..
        var getDesiredAmountOfObjects = function (objects, randomObjects) {
            return function (desiredAmount) {
                var amount = desiredAmount || 1;

                if (amount >= objects.length) {
                    return objects;
                }

                var randoms = randomObjects.slice(0, amount);

                //logged objects are always the same in each $digest loop.
                //including the $$hashKey
                console.log(random); 

                return randoms;
            };
        };

        //this will initialized only once in controller
        ObjectRes.query(function(data) { 
            $scope.objects = data;
            var randomObjects = [];
            angular.extend(randomObjects, data);
            randomObjects.sort(function () {
                return 0.5 - Math.random();
            });


            $scope.randomObjects = getDesiredAmountOfObjects($scope.objects, randomObjects);
        });

..

【问题讨论】:

    标签: angularjs ngresource


    【解决方案1】:

    我看不到所有内容,因为我还没有看到 $watch 和视图是如何设置的,但是有些东西突然出现在我身上。

    如果 randomObjects 在观察者中被调用,并设置为同样被观察的作用域上的值,这将导致无限的$digest 循环。

    这是因为您不断返回一个新数组引用(slice 返回一个新数组)。结果的观察者将识别出引用已更改,这将需要一个新的摘要循环,这将要求新的randomObjects,这将触发某些更改等。

    通常,您可以通过确保您的函数返回对同一对象的引用而不创建新数组来解决此问题。在您的情况下,您正在调用 slice ,它每次都会创建一个新数组。您需要确保此函数每次返回相同的数组。

    大概是这样的吧?

        var getDesiredAmountOfObjects = function (objects, randomObjects) {
            var result = [];
    
            return function (desiredAmount) {
                var amount = desiredAmount || 1;
    
                if (amount >= objects.length) {
                    return objects;
                }
    
                // clear the result array and put randoms into it
                result.length = 0;
                result.push.apply(result, randomObjects.slice(0, amount));
    
                //logged objects are always the same in each $digest loop.
                //including the $$hashKey
                console.log(result); 
    
                return result;
            };
        };
    

    【讨论】:

    • 非常感谢您的时间和知识!这很好用!我这样想太多了,没有看到明显的东西。 TIL angular 正在观察实际对象,而不仅仅是 $$hashKey。
    • 是的,我一直被这个问题所困扰。我编写代码的功能如此强大,而且我不认为维护 Angular 的监视系统所必需的引用完整性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多