我试图挂接一个临时函数进行测试,该函数返回一个随机日期以显示在我的视图中。这是一个错误,因为它被卡在了一个循环中,所以我认为将它切换到单向绑定是可行的,但问题仍然存在。实际错误为:
[$rootScope:infdig] 10 $digest() iterations reached. Aborting!
当绑定到返回随机值的方法调用时,Angular为什么会陷入无限循环?一旦表达式返回一个不是undefined
的值,它不应该停止求值吗?
示例plunk
注意:我不是在寻找修复方法,我已经用一次性生成的随机值替换了函数调用,但我很想知道为什么在模型应该(根据我的理解)稳定后,一次性绑定会继续评估
要理解为什么会发生这种情况,您需要了解摘要周期。
脏检查
Angular基于"脏检查"。Angular基本上遍历$scope
中的所有属性,以查看发生了什么变化。如果任何属性发生变化,Angular会激发所有这些属性的观察者,让他们知道的变化
由于手表可以更改作用域的属性,Angular在手表完成后会运行另一轮脏检查。当消化循环对所有属性进行迭代,发现它们都没有改变时,消化循环就停止了。
当手表总是为Math.random()
中连续发生的属性设置新值时,就会出现无限摘要