1

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

这是我的控制器的片段:

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

..
4

1 回答 1

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;
        };
    };
于 2014-02-25T11:04:02.807 回答