【问题标题】:Angular - Error: 10 $digest() iterations reached. AbortingAngular - 错误:达到 10 次 $digest() 迭代。中止
【发布时间】:2015-05-30 09:46:39
【问题描述】:

我正在尝试在我的 ng-src 路径中放入一个随机整数,如下所示:

<div ng-repeat="user in users">
      <img ng-src="{{randomPicture()}}" alt="">
</div>

这是我在控制器中的基本功能:

$scope.randomPicture = function(){
  var PATH = 'assets/images/';
  var image = Math.floor((Math.random() * 12) + 1);
  var ext = '.jpg';
  var randomPic = PATH + image + ext;

  return randomPic;
};

图像已显示,但在控制台中出现此错误:

Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!

我在 * 中发现了很多关于此的问题,但我仍然无法摆脱该错误。感谢您的帮助。

【问题讨论】:

  • 试试这个 src="randomPicture()"
  • 我尝试过这种方式,但不幸的是无法正常工作......
  • 以下更新的 floribon 答案完美运行,并在我的情况下修复了错误 10 $digest() 问题。

标签: javascript angularjs random


【解决方案1】:

您的绑定是随机的,每次 Angular 执行此绑定的观察者时都会有所不同。

但是,Angular 仅在达到稳定状态时才会停止摘要循环,在这种状态下所有观察者连续两次返回相同的值,而您的观察者永远不会发生这种情况。

简而言之,您不能在 Angular 绑定中绑定随机值或任何始终不同的值。您应该生成一次图片,并可选择根据某些事件重新随机化它。

$scope.randomPicture = generateRandomPicture();

<img ng-src="{{randomPicture}}">

更新:如果你想每 3 秒刷新一次图片,你可以添加

// Generate a new random picture every 3 seconds
$interval(function() {
  $scope.randomPicture = generateRandomPicture();
}, 3000);

更新 2: 既然我更好地理解了您的问题,我会建议保留所有内容,但如果至少使用 Angular 1.3,请使用::,如下所示。这样,您将为每个用户生成一张随机图片,但只生成一次。

在早期版本的 Angular 中,您可以为每个用户生成一个感觉随机的确定性图像。例如在您的 HTML 中使用:

<img ng-src="{{randomPicture($index)}}">

在你的控制器中

var rand1 = Math.round(Math.random()*10);
var rand2 = Math.round(Math.random()*10);

$scope.randomPicture = function(index) {
  var PATH = 'assets/images/';
  var image = (index+rand1*rand2)%13 + 1;
  var ext = '.jpg';
  var randomPic = PATH + image + ext;

  return randomPic;
};


请注意,如果您使用 Angular 1.3+ 并且只想生成一次图片,则可以使用 ont-time binding 使用 :: 语法(使用与 randomPicture 相同的代码):
<img ng-src="{{::randomPicture()}}">

【讨论】:

  • 感谢 floribon 的帮助,但使用此解决方案:generateRandomPicture(),只会生成一次新图片。这是我解决问题的第一个解决方案。
  • 就像我看到其他人支持这个答案一样,我只是想准确地说 该解决方案不起作用......
  • @adam 该解决方案解决了您的问题:您根本无法在此函数中生成随机图片。您应该在需要时手动刷新范围内的图片集:在超时、特定用户操作等之后。也许您可以指定您希望看到的确切内容?你到底想做什么?
  • 谢谢 floribon,我的问题并不准确。我正在谈论的图像实际上是 ng-repeat 中的 Images 并且我想要通过在其中添加一个随机整数来为这些图像提供一个独特的图像像我的例子中的路径。所以 $interval 并不是我真正需要的解决方案,我很抱歉造成混乱。我编辑了这个问题。
  • 哦,我明白了,我已经再次更新了我的答案,让您了解解决方案。您想避免出现两次相同的图片还是没有问题?
最近更新 更多