angular js'?'在ng-src中导致无限循环

时间:2013-06-20 19:48:08

标签: angularjs angularjs-directive

我正在尝试使用AngularJS

来绕过IE从缓存中获取图像

我有以下代码

<img ng-src="./individuals/image/{{team._id}}/{{member._id}}{{getRandom()}}" >

在控制器中

$scope.getRandom=function(){
        return "?ran="+new Date().getTime()+"";
}

当我跑步时,我收到此错误

Error: 10 $digest() iterations reached. Aborting! Watchers fired in the last 5 iterations: [["fn: function (a){\n\"use strict\";\ntry{for(var b=0,c=q,g;b<c;b++){if(typeof(g=l[b])==\"function\")g=g(a),g==null||g==s?g=\"\":typeof g!=\"string\"&&(g=da(g));B[b]=g}return B.join(\"\")}catch(f){d(Error(\"Error while interpolating: \"+e+\"\\n\"+f.toString()))}}; newVal: \"./individuals/image/51c209ead8b8d863ad69de97/51c209ead8b8d863ad69de65?ran=1371757784485\"; oldVal: \"./individuals/image/51c209ead8b8d863ad69de97/51c209ead8b8d863ad69de65?ran=1371757784457\"","fn: function (a){\n\"use strict\";\ntry{for(var b=0,c=q,g;b<c;b++){if(typeof(g=l[b])==\"function\")g=g(a),g==null||g==s?g=\"\":typeof g!=\"string\"&&(g=da(g));B[b]=g}return B.join(\"\")}catch(f){d(Error(\"Error while interpolating: \"+e+\"\\n\"+f.toString()))}}; newVal: \"./individuals/image/51c209ead8b8d863ad69de97/51c209ead8b8d863ad69dec9?ran=1371757784487\"; oldVal: \"./individuals/image/51c209ead8b8d863ad69de97/51c209ead8b8d863ad69dec9?ran=1371757784459\"","fn: function (a){\n\"use strict\";\ntry{for(var b=0,c=q,g;b<c;b++){if(typeof(g=l[b])==\"function\")g=g(a),g==null||g==s?g=\"\":typeof g!=\"string\"&&(g=da(g));B[b]=g}return B.join(\"\")}catch(f){d(Error(\"Error while interpolating: \"+e+\"\\n\"+f.toString()))}}; newVal: \"./individuals/image/51c209ead8b8d863ad6

如果我删除{{getRandom()}},则可以正常使用。

请帮助..提前致谢

更新:请在下面找到修复此问题的控制器更改。感谢Liviu T的回答。

$scope.lastMillis = new Date().getTime();
    $scope.getRandom=function(){
        var curMillis = new Date().getTime();
        if (curMillis-$scope.lastMillis>5000) {
            $scope.lastMillis = curMillis;
        }
        return "?ran="+$scope.lastMillis;
    }

1 个答案:

答案 0 :(得分:5)

我认为问题是getRandom函数每次调用时返回一个不同的值。 这是发生的事情:

  1. Angular调用您的函数
  2. 获取值
  3. 看到它与之前的值不同
  4. 将周期标记为脏
  5. 循环结束后,重新运行循环,从而获得新值...
  6. 这个想法是让getRandom在一段时间内给出谨慎的价值。 例如,只要你认为合适,每1,10,30秒给出一个新值。

    这个建议实际上适用于很多事情。 Angular不保证它会调用绑定中找到的函数的次数。所以你需要快速制作它们,并且你需要确保对于相同的输入它们返回相同的输出(大多数时候,尽管在这种情况下它可能是合理的)。

    还要考虑图像何时/如何更改,以及是否可以通过其他内容触发实际更改,只考虑仅在触发实际更改时为getRandom创建新的结果值(例如:用户上传新的配置文件图像,计时器执行等)

    更新:无法使用Chrome在plunker中复制