【问题标题】:AngularJS why I'm getting this Error: $rootScope:infdig Infinite $digest Loop and How to Fix itAngularJS 为什么我会收到此错误:$rootScope:infdig Infinite $digest Loop 以及如何修复它
【发布时间】:2016-04-27 20:50:43
【问题描述】:

我正在用 D3 和 Angular 编写指令。我不确定为什么我一直收到Infinite $digest loop 错误,因为我没有看到对newValue 的任何重新分配。功能运行良好,但浏览器中恼人的错误让我想深入研究它。

指令代码如下:

scope.$watch('mode', function (newValue, oldValue) {
    if (newValue !== oldValue) {
        scope.triggerAnimation();
    }
});

scope.triggerAnimation = function() {
    var speed = 4;
    var start = Date.now();

    if (scope.mode === null) {
        d3.timer(function() {
            var angle = (Date.now() - start) * speed;
            var transform = function(d, i) { return "rotate(" + angle / 50 + "," + centerX + "," + centerY + ")"; };

            svg.selectAll(".sidenode, .sidenodeedge").attr("transform", transform);
            if (scope.mode == null) {
                return true;
            } else {
                return false;
            }
        });
        scope.mode = 1;
    } else {
        scope.mode = null;
    }
}

【问题讨论】:

    标签: javascript angularjs d3.js


    【解决方案1】:

    在您的代码中,您有以下内容:

    scope.$watch('mode', function (newValue, oldValue) {
        if (newValue !== oldValue) {
            scope.triggerAnimation();
        }
    });
    

    然后你运行这个函数,它总是会改变scope.mode的值

    scope.triggerAnimation = function() {
        ...
        if (scope.mode === null) {
            // some code here
            scope.mode = 1;
        } else {
            scope.mode = null;
        }
    }
    

    看起来它总是会将scope.mode 的值从null 更改为1。并且每次都会升$digest电话。又一次……又一次……

    【讨论】:

    • 现在我明白了为什么一次又一次地调用摘要循环。先谢谢了!但是,我确实需要更改 if else 循环中的 mode 值。有关如何修复的任何建议?
    • 第一:你的任务需要使用$watch吗?不使用这个功能就无法解决吗?因为,不建议使用它,并建议尽可能避免使用它。第二:你需要观察(通过$watch)并在if else中改变同一个变量吗?
    • 1 $watch 不是必须的.​​..我可以使用其他选项,但我需要监视该值是否更改... 2. 我确实需要更改相同的变量
    • triggerAnimation函数中应该有一个退出条件,它不会改变模式值。
    • 同意@MadhuRanjan - 你的动画不应该一直运行。如果你需要在某个时间间隔运行它,那么你应该使用不同的东西而不是$watch(例如$timeout
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多