在AngularJS中,我们更新模型,视图/模板“自动”更新DOM(通过内置或自定义指令)。
$Apply和$Watch都是作用域方法,与DOM无关。
这个概念页面(“运行时”部分)很好地解释了$摘要循环、$Apply、$valAsync队列和$Watch列表。以下是随文而来的图片:
任何可以访问作用域的代码-通常是控制器和指令(它们的链接函数和/或它们的控制器)-都可以设置一个“表表示法“AngularJS将根据该范围进行计算。每当AngularJS进入其$Digest循环(特别是”$watch list“循环)时,就会进行此评估。您可以查看单个范围属性,可以定义一个函数来同时监视两个属性,还可以查看数组的长度等等。
当事情发生在“AngularJS内部”时-例如,输入一个具有AngularJS双向数据库功能的文本框(即使用ng-model)、$http回调火等。$Apply已经被调用,所以我们在上图中的“AngularJS”矩形中。所有的表示都将被评估(可能不止一次-直到没有检测到进一步的更改)。
当事情发生在“AngularJS之外”-例如,您在指令中使用了BIND(),然后该事件触发,导致您的回调被调用,或者一些jQuery注册的回调火-我们仍然处于“本机”矩形中。如果回调代码修改了任何$Watch正在观察的内容,则调用$Apply进入AngularJS矩形,从而使$Digest循环运行,从而AngularJS会注意到变化并执行其魔术。