簡體   English   中英

在角度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-showng-if無需$watch$apply即可更新DOM

這是樣本jfiddle

如你看到的

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

每當scope.authenticateVariable更新時更新

這是想發生嗎,還是我在想什么呢?

ng-ifng-show默認具有watch

{{}}ng-modelng-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM