当一个摘要周期发生时,我很困惑,它是否每50毫秒定时调用一个定时器(如here所示,暗示here)或是在每个事件后调用它进入角度上下文(如here,here和here)?
重要的例子:
在我的模型中,我有一个名为myVar
的变量,其值为3。
在我的HTML中,我有{{myvar}}
。
触发按钮单击等事件并在控制器中引发处理程序,处理程序内的代码为:
$scope.myVar = 4;
// some heavy actions takes place for 3 seconds...
$scope.myVar = 5;
假设未阻止UI线程,用户在点击按钮后会看到什么?他会看到5或者他会看到4和3秒后5?
答案 0 :(得分:25)
我认为http://blog.bguiz.com/post/60397801810/digest-cycles-in-single-page-apps的摘要周期描述是
以间隔运行的代码
非常具有误导性,说实话,在提到Angular时,我甚至会说错。引用Pawel Kozlowski,Mastering Web Application Development with AngularJS
AngularJS不使用任何类型的轮询机制来定期检查模型更改
如果你有
的模板,要证明没有民意调查<p>{{state}}</p>
和
的控制器代码$scope.state = 'Initial';
// Deliberately *not* using $timeout here
$window.setTimeout(function() {
$scope.state = 'Changed';
},1000);
as in this plunker,然后显示给用户的字符串将保持为Initial
,永远不会更改为Changed
。
如果您想知道为什么经常看到$apply
的来电,但并非总是如此,这可能是因为Angular附带的各种指令,例如ngClick
或ngChange
自己调用$apply
,然后触发循环。原生JS事件的事件监听器不会直接执行此操作,因此他们必须故意调用$apply
以使模板中反映出任何更改。
答案 1 :(得分:11)
当角度上下文中出现以下任何一种情况时,摘要过程就会被启动:
重要的是要注意,正常的浏览器相关DOM事件(onclick等)和setTimeout不会触发摘要过程,因为它们在“Angular Context”之外工作。
以上是此处提供的非常深入的教程的快照:https://www.youtube.com/watch?v=SYuc1oSjhgY
答案 2 :(得分:3)
从外部处理时(包括ajax)处理的任何AngularJS范围变量都需要$ apply()。
Prop
是Javascript函数因此更新angularjs值需要setTimeout
。
$apply
是一个angularjs函数,它返回promise并负责当前作用域,并在同一个摘要周期中运行。
因此无需$timeout
函数来更新值。