当前位置: 首页 > 面试题库 >

错误:达到10个$ digest()迭代。流产!具有动态sortby谓词

林英锐
2023-03-14
问题内容

我有以下代码重复并显示用户名及其分数:

<div ng-controller="AngularCtrl" ng-app>
  <div ng-repeat="user in users | orderBy:predicate:reverse | limitTo:10">
    <div ng-init="user.score=user.id+1">
        {{user.name}} and {{user.score}}
    </div>
  </div>
</div>

以及相应的角度控制器。

function AngularCtrl($scope) {
    $scope.predicate = 'score';
    $scope.reverse = true;
    $scope.users = [{id: 1, name: 'John'}, {id: 2, name: 'Ken'}, {id: 3, name: 'smith'}, {id: 4, name: 'kevin'}, {id: 5, name: 'bob'}, {id: 6, name: 'Dev'}, {id: 7, name: 'Joe'}, {id: 8, name: 'kevin'}, {id: 9, name: 'John'}, {id: 10, name: 'Ken'}, {id: 11, name: 'John'}, {id: 1, name: 'John'}, {id: 2, name: 'Ken'}, {id: 3, name: 'smith'}, {id: 4, name: 'kevin'}, {id: 5, name: 'bob'}, {id: 6, name: 'Dev'}, {id: 7, name: 'Joe'}, {id: 8, name: 'kevin'}, {id: 9, name: 'John'}, {id: 10, name: 'Ken'}]
}

当我运行上面的代码时,我得到 错误:10 $ digest()迭代达到。 流产!我的控制台错误。

我已经为它创建了jsfiddle。

排序谓词仅在ng-repeat内部初始化,并且限制也应用于对象数。所以我觉得将sortby和limitTo监视者放在一起是错误的原因。

如果$ scope.reverse为false(分数的升序),则它不会出错。

谁能帮我了解这是怎么回事?非常感谢您的帮助。


问题答案:

请检查此jsFiddle。(代码基本上与您发布的代码相同,但是我使用元素而不是窗口来绑定滚动事件)。

据我所知,您发布的代码没有问题。当您在属性上创建更改循环时,通常会发生您提到的错误。例如,当您监视某个属性的更改,然后在侦听器上更改该属性的值时,就像这样:

$scope.$watch('users', function(value) {
  $scope.users = [];
});

这将导致错误消息:

未捕获的错误:达到10个$ digest()迭代。流产!
观察者在最近5次迭代中解雇了:…

确保您的代码没有这种情况。

更新:

这是你的问题:

<div ng-init="user.score=user.id+1">

您不应该在渲染过程中更改对象/模型,否则,它将强制执行新的渲染(并因此导致 循环 ,从而导致 “错误:达到10次$
digest()迭代。异常终止!”
)。

如果要更新模型,请在Controller或Directive(而不是视图)上进行。angularjs文件建议不使用的ng- init完全相同,以避免这些种情况:

在模板中使用ngInit指令(仅适用于玩具/示例应用,不建议用于实际应用)

这是一个带有工作示例的jsFiddle。



 类似资料:
  • 问题内容: 我正在尝试使用Angular创建Metro Tile类型的网格,以实现这一目标,我希望每个瓷砖都具有不同的颜色。因此,我的行动计划是创建一个函数,该函数将在循环内随机选择一种颜色(使用)。这是我到目前为止所拥有的… 如您所见,我正在使用名为RandomColourClass的函数设置类名称,这是JS位 这一切工作正常,并且图块具有不同的颜色,但我一直收到以下错误 错误:达到10个$ d

  • 问题内容: 我是Angular的新手,并且遇到了与IE相关的问题。 这是我得到的IE错误。 在IE 8和IE 9之外的任何其他浏览器中都不会发生这种情况。 我有一只手表在看一个包含位置过滤器的内容过滤对象。 我对此的疑问是,为什么它不会在除IE之外的任何其他浏览器上发生,并且我应该怎么做才能消除它。提前致谢。 问题答案: 我有相同的问题,看起来却一样。Chrome \ FF工作正常,但IE失败。我

  • 问题内容: 达到10个$ digest()迭代。流产! 有很多支持文本,例如“在最近5个迭代中触发了Watchers:”等,但是其中很多文本是来自各种功能的Javascript代码。有诊断此问题的经验法则吗?是可以始终缓解的问题,还是应用程序足够复杂,因此应将其视为警告? 问题答案: 正如Ven所说,您或者在每个循环中返回不同(不相同)的对象,或者您将数据更改了太多次。 确定您的应用程序的哪个部分

  • 问题内容: 我从后端服务器接收数据,其结构如下: 以我的观点,我想“反转”列表。即,我想列出每个所有者,并为该所有者列出所有汉堡包。我可以通过在过滤器中使用underscorejs函数来实现此目的,然后将其与指令一起使用: JS: HTML: 这可以按预期工作,但是当使用错误消息“达到10个$ digest迭代次数”来呈现列表时,我得到了一个巨大的错误堆栈跟踪。我很难看到我的代码如何创建此消息暗示

  • 我有一个功能,刚刚被报道在internet explorer中不起作用。不知道它有多长时间不起作用了,但我想它从一开始就起作用了。我可以在IE11中验证它。 我的应用程序使用angularjs 1.3.17。 表单上有一个名为重置的按钮。当他们点击它时,它调用,如下所示: 它将recordID发布到API,API在后端执行大量操作。只要成功,它就会返回一个。 成功后,它会将空字符串写入locals

  • 问题内容: 我在这个小提琴中玩弄指令和绑定。我收到以下错误: 为什么会这样呢?我认为这与绑定有关。 问题答案: 这是因为它在每次经历摘要周期时都在创建一个全新的对象。监视在此数据绑定中注册,因此每次它评估一个新对象时都会创建它,因此它将与以前的值不同,从而触发另一个摘要循环。最终,它终止,因此不会无限循环。有关更详尽的说明,请参见http://docs.angularjs.org/guide/co