在AngularJS中,我們更新模型,視圖/模板“自動”更新DOM(通過內(nèi)置或自定義指令)。
$Apply和$Watch都是作用域方法,與DOM無關(guān)。
這個概念頁面(“運(yùn)行時(shí)”部分)很好地解釋了$摘要循環(huán)、$Apply、$valAsync隊(duì)列和$Watch列表。以下是隨文而來的圖片:
任何可以訪問作用域的代碼-通常是控制器和指令(它們的鏈接函數(shù)和/或它們的控制器)-都可以設(shè)置一個“表表示法“AngularJS將根據(jù)該范圍進(jìn)行計(jì)算。每當(dāng)AngularJS進(jìn)入其$Digest循環(huán)(特別是”$watch list“循環(huán))時(shí),就會進(jìn)行此評估。您可以查看單個范圍屬性,可以定義一個函數(shù)來同時(shí)監(jiān)視兩個屬性,還可以查看數(shù)組的長度等等。
當(dāng)事情發(fā)生在“AngularJS內(nèi)部”時(shí)-例如,輸入一個具有AngularJS雙向數(shù)據(jù)庫功能的文本框(即使用ng-model)、$http回調(diào)火等。$Apply已經(jīng)被調(diào)用,所以我們在上圖中的“AngularJS”矩形中。所有的表示都將被評估(可能不止一次-直到?jīng)]有檢測到進(jìn)一步的更改)。
當(dāng)事情發(fā)生在“AngularJS之外”-例如,您在指令中使用了BIND(),然后該事件觸發(fā),導(dǎo)致您的回調(diào)被調(diào)用,或者一些jQuery注冊的回調(diào)火-我們?nèi)匀惶幱凇氨緳C(jī)”矩形中。如果回調(diào)代碼修改了任何$Watch正在觀察的內(nèi)容,則調(diào)用$Apply進(jìn)入AngularJS矩形,從而使$Digest循環(huán)運(yùn)行,從而AngularJS會注意到變化并執(zhí)行其魔術(shù)。