[英]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
無需$watch
或$apply
即可更新DOM
這是樣本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的優點,數據和視圖如此交織在一起,當發生更改時,它會立即反映在視圖上,反之亦然。
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; DR
您看到的是Angular中的默認行為,而不僅僅是1.4。 您提到的方法是對摘要循環進行更細粒度的控制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.