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