在angular 1.4.4中,为什么作用域变量的变化不需要$watch或$apply就能传播到DOM ?

In angular 1.4.4, why does a change in scope variable propagate to DOM without $watch or $apply?

本文关键字:apply watch 传播 DOM 变化 angular 为什么 作用域 变量 不需要      更新时间:2023-09-26

从文档

Scopes provide APIs ($watch) to observe model mutations.
Scopes provide APIs ($apply) to propagate any model changes through the system into the view from outside of the "Angular realm" (controllers, services, Angular event handlers).

作用域更改仅通过$watch$apply传播,但是似乎每当我更改控制器内的作用域变量时,属于该控制器的DOM就会开始一个新的生命周期。例如,ng-showng-if更新DOM没有$watch$apply

下面是示例jfiddle

如你所见

<div ng-if="authenticateVariable"> without watch or apply</div>

scope.authenticateVariable更新时的更新

这是应该发生的,还是有一些微妙的我错过了。

ng-ifng-show默认有watch

{{}}, ng-model, ng-click等类似。$timeout$http等服务将$scope.$apply设置为默认值。这就是所谓的Angular的two-way binding,它对开发人员来说非常有吸引力。

是的,这是应该发生的(除非我误解了你的问题)。

这就是AngularJS的美妙之处,Data &视图是交织在一起的,当某些东西发生变化时,它会立即反映到视图上,反之亦然。

ng-if必须监视scope,因为如果有任何变化,它需要立即填充,并开始构建该部分。

您链接的同一文档显示

在模板链接阶段,指令在作用域上设置$watch表达式。

使用ng-if作为一个指令(https://docs.angularjs.org/api/ng/directive/ngIf),它确实这样做,然后监视你的作用域

这是Angular的默认行为。当作用域上的值发生变化时,Angular会运行一个摘要循环。这就是允许双向绑定的原因,等等。

$scope.$apply用于更多地手动控制何时运行摘要循环。正如文档所说,如果Angular上下文之外的东西发生了变化(因此Angular不知道),你可以使用$scope.$apply来运行一个摘要循环。参见$scope.$digest .

$scope.$watch允许你在$scope上手动监视一些Angular在默认情况下不会监视的东西,或者当你想在值改变时执行额外的功能时。

TL,博士

你看到的是Angular的默认行为,而不仅仅是1.4。您提到的方法用于对摘要周期进行更细粒度的控制。