【问题标题】:Angular js 10 $digest() iterations reached. AbortingAngular js 10 $digest() 迭代达到。中止
【发布时间】:2016-12-21 10:04:42
【问题描述】:

在调查了这个错误后,我发现它来自这段代码,但我不知道为什么以及如何修复它。

$scope.mindate = function() {
    var thisDay = new Date();
    var priorDate = new Date().setDate(thisDay.getDate() - 90);
    return new Date(priorDate);
};

【问题讨论】:

  • 出现此错误,当摘要循环递归运行时,这通常发生在一次更改一次又一次触发相同更改时。您需要在此处添加更多代码和标记才能解决问题

标签: javascript angularjs


【解决方案1】:

你可以缓存它:

$scope.mindate = function() {
    if(!$scope.mindateCached){
        var thisDay = new Date();
        var priorDate = new Date().setDate(thisDay.getDate() - 90);
        $scope.mindateCached = new Date(priorDate);
    }
    return $scope.mindateCached;   
};

【讨论】:

    【解决方案2】:

    Angular 脏检查迭代次数最多为 10。如果您的代码在完成脏检查之前频繁更改,则会抛出错误。 PS:请贴出完整代码。

    【讨论】:

      【解决方案3】:

      这是因为你总是返回一个“new Date()”。

      当您为模型赋值时,Angular 会检测到更改并触发摘要循环以应用所有更改。一旦第一个摘要循环完成,它将再次检查所有内容以检查是否有任何更改,如果没有,它将停止并等待下一次更改。如果是,它将经历另一个摘要循环。

      在你的情况下,因为你总是返回一个新的 Date() 对象,所以角度总是会在每个周期后检测到发生变化的东西,并且在 10 个周期后会有一个硬停止,之后角度会像:“是的,让我们不要跑进入无限循环。”你得到了你现在得到的错误。

      【讨论】:

      • 创建一个单独的函数来设置 $scope.mindate 并且仅在您想要更改 mindate 时调用该函数。如果只是设置初始值,只需在控制器开始处调用该函数即可。
      【解决方案4】:

      尝试在 html 中使用 bind-once https://toddmotto.com/angular-one-time-binding-syntax/

      【讨论】: