你是不是也常在想AngularJS $apply, $digest, 和$evalAsync到底有什么差別?這個(gè)篇博客中我們將探討一下這三個(gè)方法。

AngularJS之所以這么受歡迎,是因?yàn)樗泻芏嗟奶幚沓绦驇臀覀兺瓿闪私^大部分的求值運(yùn)算。AngularJS讓前端開發(fā)工作變的簡(jiǎn)單高效,通過指令我們可以創(chuàng)建html標(biāo)簽,還可以創(chuàng)建獨(dú)立的模塊,AngularJS確實(shí)是創(chuàng)建SAP的最好框架之一。

AngularJS的核心之一就是$digset循環(huán),這是AngularJS檢測(cè)和重新呈現(xiàn)model和view的變化的方法。在每一個(gè)$digset循環(huán)中,檢測(cè)列表中的所有的檢測(cè)對(duì)象都會(huì)被執(zhí)行,重新計(jì)算綁定到視圖的模型對(duì)象,然后又將重新渲染的視圖呈現(xiàn)給用戶。這個(gè)過程是影響AngularJS性能的主要部分。

但是很多時(shí)候,我們需要在AngularJS的上下文之外對(duì)模型進(jìn)行操作,而這樣的操作AngularJS是無法檢測(cè)到的,也就是說它不能更新model并重新呈現(xiàn)視圖。我們有三個(gè)方法能個(gè)完成這個(gè)工作$apply,$digset和$evalAsync,但是在我們不知其所以然的直接調(diào)用他們之前,我們需要了解一下為了解決問題我們到底需要影響多少個(gè)檢測(cè)對(duì)象,影響多少層scope。

這里有多種方法可以讓AngularJS執(zhí)行計(jì)算,也就是讓AngularJS開啟一個(gè)新的$digset循環(huán):

  1. $apply()
  2. $timeout()
  3. $digest()
  4. $evalAsync()


$apply()

$apply()會(huì)觸發(fā)整個(gè)應(yīng)用中的所有scope上的$digset循環(huán)。意思就是,每次我們調(diào)用$apply()都會(huì)在整個(gè)應(yīng)用的生命周期中開啟一個(gè)新的$digset循環(huán)。整個(gè)生命周期涉及3個(gè)主要任務(wù):

Scope’s $apply() method transitions through the following stages:

  1. The expression is executed using the $eval() method.
  2. Any exceptions from the execution of the expression are forwarded to the $exceptionHandler service.
  3. The watch listeners are fired immediately after the expression was executed using the $digest() method.

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式