使用ngResource时如何避免Infinite $ digest循环错误

时间:2014-02-25 10:31:43

标签: angularjs ngresource

我正在观察我的指令中的$ scope.randomObjects。如果函数不稳定,$ watch将抛出一个错误,我认为getDesiredAmountOfObjects中的curried函数是幂等的。这里有什么东西正在进行ngResource -objects,我看不到? 我怎样才能解决这个问题?此外,目前还需要修复所需的安装。

以下是我的控制器的片段:

..
        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);
        });

..

1 个答案:

答案 0 :(得分: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;
        };
    };