在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?
从文档
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-show
或ng-if
更新DOM没有$watch
或$apply
下面是示例jfiddle
如你所见
<div ng-if="authenticateVariable"> without watch or apply</div>
scope.authenticateVariable
更新时的更新
这是应该发生的,还是有一些微妙的我错过了。
ng-if
和ng-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。您提到的方法用于对摘要周期进行更细粒度的控制。
- Javascript:如何获取函数.apply()的键
- 另一个if(!$scope.$$phase)$scope$apply()szenario-需要帮助才能通关
- call()和apply()实际上是用来欺骗方法处理类似数组的对象的
- angularjs$watch获取已更改数组项的索引
- 在控制器上使用“$watch”时,为什么不更新此隐藏字段
- 指令$watch不会在更改时触发
- Angular Apply已经在进行中
- 是否可以在不更改上下文的情况下调用函数.apply
- 角度范围$watch()等效于Rivets.js
- Error: timers.js:234 callback.apply(timer, args);
- 强制 $scope.$watch 只开火一次
- AngularJS ng src不会在$rootScope上使用$watch进行更新
- 在lodash上有没有一个替代方案.merge.apply(_,x);其中x是对象的数组
- 让ng更改等待$watch完成
- How to apply javascript on <asp:Buttonfield>?
- 在使用AngularJS时,我应该在$apply和$watch之间使用哪个
- 了解窗口调整大小事件与 scope.$apply 与函数$watch
- $digest不久之后$watch定义触发“$apply已经在进行中.“错误
- 在$watch中使用$apply
- 在angular 1.4.4中,为什么作用域变量的变化不需要$watch或$apply就能传播到DOM ?