关于范围的角度初学者问题(docs here)。
$eval
在范围的上下文中执行表达式。$apply
基本上会调用$eval
,然后调用$digest
。$evalAsync
也会调用$digest
(或者更确切地说,确保调用$digest
)?似乎$
eval
Async
应该被称为$
apply
Async
,不是吗?
我是初学者 - 我错过了什么?
答案 0 :(得分:3)
$evalAsync
和$applyAsync
针对不同情况。
$ evalAsync :将表达式推迟到当前摘要周期的下一循环迭代。一个Angular摘要循环循环几次,直到没有数据变脏。如果没有正在进行的摘要周期,它将启动一个新的摘要周期(调用$apply
方法)并评估其中的表达式(调用$eval
方法)。如果从Angular范围调用函数但仍希望在摘要周期正在进行时消化脏数据,则此方法很有用,在这种情况下,您无法调用$apply
。
$ applyAsync :将表达式推迟到下一个摘要周期。在评估表达式之后,它总是开始一个新的摘要循环(调用$apply
方法)。如果经常执行一些服务回调(如$http
服务),请使用脏范围数据执行Angular范围,此方法很有用。但是,如果它为每个回调启动摘要,则可能会有糟糕的性能。因此,此方法通过在几个异步回调之间共享摘要周期来优化过程,这些回调优于方法$evalAsync
。
答案 1 :(得分:2)
$ applyAsync已存在:
安排$ apply的调用以后发生。实际时间差异因浏览器而异,但通常约为10毫秒。
这可用于排队需要在同一摘要中评估的多个表达式
evalAsync以不同的方式处理摘要:
$ evalAsync触发摘要,并且在预期a时不合适 消化不应该发生。
注意:如果在$ digest循环之外调用此函数,则将安排新的$ digest循环。
在AngularJS 1.3中隐式更改时调用此行为:
- 以前,即使将invokeApply设置为false,在promise解析期间也会发生$ rootScope摘要。 现在不再是这种情况,因为从$ timeout和$ interval返回的promise将不再触发$ evalAsync (如果invokeApply为false,则反过来导致$摘要)。
变通办法包括手动触发$ scope。$ apply(),或者从promise回调中返回$ q.defer()。promise,并在适当的时候解析或拒绝它。
<强>参考强>