Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何预防;错误:$rootScope:infdig";当每次的预期行为值不同时_Javascript_Angularjs - Fatal编程技术网

Javascript 如何预防;错误:$rootScope:infdig";当每次的预期行为值不同时

Javascript 如何预防;错误:$rootScope:infdig";当每次的预期行为值不同时,javascript,angularjs,Javascript,Angularjs,我正在使用AngularJS(带有咏叹调、动画、材质、消息、消毒和路由)制作一个页面,一切都很好,但我有点问题。Angular喜欢在每次刷新页面时函数返回的值不同时抛出“Error:$rootScope:infdig”,但这正是我编写的一个函数要做的 守则: <script> angular.module('tht', ['ngMaterial', 'ngSanitize', 'ngMessages', 'ngAnimate', 'ngAria']) .contr

我正在使用AngularJS(带有咏叹调、动画、材质、消息、消毒和路由)制作一个页面,一切都很好,但我有点问题。Angular喜欢在每次刷新页面时函数返回的值不同时抛出“Error:$rootScope:infdig”,但这正是我编写的一个函数要做的

守则:

<script>

    angular.module('tht', ['ngMaterial', 'ngSanitize', 'ngMessages', 'ngAnimate', 'ngAria'])

    .controller('MainController', ['$scope', '$rootScope', function($scope, $rootScope) {
        $rootScope.version = '0.1';
        $rootScope.name = 'tht';
        $rootScope.author = 'D3add3d';
        $rootScope.year = '2016';
        $scope.jokes = ["We ate a bunch of doritos and now the page is blank...", 
                        "Sometimes it just looks like this...", 
                        "Kappa, Kappa, Kappa, Kappa...", 
                        "This text changes every time I refresh the page, weird huh o_O", 
                        "We are out of doritos :-/", 
                        "Powered by your satisfaction... wait", 
                        "Instead of working on this page, I'm writing these jokes #procrastination", 
                        "Have a hug or two *hugs*", 
                        "<3", "<3~~~", 
                        "This joke is so simple... return array[Math.floor(Math.random() * array.length)];", 
                        "Go eat some chocolate, it helps ;)", 
                        "I love you all :-* <3", "[~~HUG~~]", 
                        "[?BUG?]"];
        $scope.randomJoke = function() {
            return $scope.jokes[Math.floor(Math.random() * $scope.jokes.length)]; //function that returns different value (almost) every time it is called
        }
    }]);

</script>

角度模块('tht'、['ngMaterial'、'ngSanitize'、'ngMessages'、'ngAnimate'、'ngAria']))
.controller('MainController',['$scope','$rootScope',函数($scope,$rootScope){
$rootScope.version='0.1';
$rootScope.name='tht';
$rootScope.author='D3add3d';
$rootScope.year='2016';
$scope.crooks=[“我们吃了一堆多丽多,现在页面是空白的…”,
“有时候看起来就像这样……”,
“卡帕,卡帕,卡帕,卡帕……”,
“每次我刷新页面时,此文本都会发生变化,奇怪吧,呵呵”,
“我们没有多丽托斯了:-/”,
“以你的满意为动力……等等”,
“我不是在这一页上工作,而是在写这些笑话#拖延”,
“拥抱一两下”,

“似乎绑定到函数是导致无限消化循环的罪魁祸首:


要解决此问题,请改为绑定到一个变量:

这不起作用,因为插值绑定是如何计算的

插值绑定不会在每次页面重新加载时计算一次。它们会在每个
$digest
周期进行计算,以确定其值是否需要更新,这是角度双向绑定工作原理的基础。不幸的是,在插值绑定内执行的函数会导致另一个
$digest
周期激发,以确定函数调用是否进行了任何需要更新其他绑定的更改

在这种情况下,这会产生一点问题,因为
$digest
永远不会稳定。对
$digest
的每次调用都会生成一个新的
随机笑话
,这会导致
$digest
再次触发。如果查看
infdig
错误,实际上可以看到在过去5次迭代中触发的
观察程序ons
oldVal
newVal
中显示5个不同的笑话

infdig
错误实际上是一种故障保护,它会在10次迭代后停止摘要,以确保您不会完全锁定浏览器。在实践中,您可以这样使用代码,但应用程序会因此受到一些非常差的性能的影响


更好的方法是绑定到分配给函数调用结果的变量,该变量在控制器初始化期间计算一次。

谢谢。这个答案更容易理解和简单,但Claies提供了更好的解释,如果可以,我会接受这两个答案:)嘿,没问题,伙计。回答的目的不是为了把它标为最佳答案,是的,他的解释很好。
<div ng-controller="MainController" ng-hide>

    <header>Hello, this is <b>{{name}}</b>, version <b>{{version}}</b>
    <article><br>{{randomJoke()}}</article> <!-- THIS IS WHAT CAUSES THE ERROR -->
    </header>
    <footer>&copy; <b>{{author}}</b>, {{year}}</footer>

</div>