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