6

关于范围的 Angular 初学者问题(此处的文档)。

  1. $eval在范围的上下文中执行表达式。
  2. $apply基本上调用$eval然后$digest
  3. 为什么也$evalAsync调用$digest(或更准确地说,$digest调用确保)?

似乎真的应该调用它,不是吗?$evalAsync$applyAsync

我是初学者——我错过了什么?

4

2 回答 2

3

$evalAsync$applyAsync针对不同的情况。

$evalAsync:将表达式推迟到当前摘要循环的下一个循环迭代。一个 Angular 摘要循环会循环几次,直到没有数据是脏的。如果没有摘要循环正在进行,它将开始一个新的摘要循环(调用$apply方法)并评估其中的表达式(调用$eval方法)。如果您在 Angular 范围之外调用函数,但仍想在摘要循环正在进行时消化脏数据,则此方法很有用,在这种情况下,您无法调用$apply.

$applyAsync:将表达式推迟到digest 的下一个周期。它总是在计算表达式(调用$apply方法)之后开始一个新的摘要循环。$http如果您经常在 Angular 范围内使用脏范围数据执行某些服务回调(如服务),则此方法很有用。但是,如果它为每个回调启动一个摘要,则性能可能会很差。因此,该方法通过在多个异步回调之间共享摘要周期来优化流程,这优于该方法$evalAsync

于 2016-04-08T06:54:28.867 回答
2

$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,并在适当时解决或拒绝它。

参考

于 2014-12-22T07:42:35.330 回答