angularJS中$apply()方法詳解_AngularJS
對於一個在前端屬於純新手的我來說,Javascript都還是一知半解,要想直接上手angular JS,遇到的阻力還真是不少。不過我相信,只要下功夫,即使是反人類的設計也不是什麼大的問題。
Okay,也不多說廢話。為了弄清楚angular JS為何物,我先從Scope開始。那什麼是Scope呢?借用官方文件的一段話:
「scope is an object that refers to the application model. It is an execution context for expressions. Scopes are arranged in hierarchical structure which mimic the DOM structure of the application. Scopes can watch
Scope的特性
接下來,看看Scope有哪些特性呢?Scope提供$watch方法監視Model的變化。
Scope提供$apply方法傳播Model的變化。
Scope可以繼承,用來隔離不同的application components和屬性存取權。
Scope為Expressions的計算提供上下文。
源起Javascript
首先,乍一看,scope.apply()似乎就是一個使得bindings得到更新的普通通的方法。但稍微多想一點,為什麼我們需要它?一般什麼時候用它呢?用弄清楚這兩個問題,還得從Javascript說。在Javascript程式碼裡,都是按照一定順序來執行的,當輪到一個程式碼片段執行的時候,瀏覽器就只會去執行目前的片段,不會做任何其他的事情。所以有時候一些做得不是很好的網頁,當點擊了某個東西之後會卡住,Javascript的工作方式就是會導致這一現象原因之一!下面我們有一段程式碼可以感受一下:
function buttonClicked () {
alert('the button was clicked');
}
button.addEventListener('click', buttonClicked);
function timerComplete () {
alert('timer complete');
}
setTimeout(timerComplete, 5000);
當載入Javascript程式碼時,先找一個一個id叫「clickMe」的按鈕,然後加入一個監聽器,然後設定逾時。等待5秒,會跳出一個對話框。如果刷新頁面並立即點擊clickMe按鈕,會彈出一個對話框,如果你不點擊OK,timerComplete函數永遠沒有機會執行。
如何更新bindings
好了,扯了一些看似不相關的東西之後,我們回歸正題。 angular JS是怎麼知道什麼時候資料的變化和頁面需要更新的呢?程式碼需要知道什麼時候資料被修改了,但是現在又沒有一種方法直接去通知說某個物件上的資料變了(儘管ECMAScript 5正在嘗試解決這個問題,但也還是處於實驗階段)。而目前比較主流的策略有以下有兩種解決方案。一種是需要用特殊的對象,讓所有的資料都只能透過呼叫對象的方法來設置,而不是直接透過property指定。這樣的話,所有的修改就可以被記錄下來了,就知道什麼時候頁面需要更新了。這樣做的弊端就是我們必須去繼承一個特殊的物件。對於賦值也只能透過object.set('key', 'value')而不是object.key=value的方式。在框架中,像EmberJS和KnockoutJS就是這麼幹的(雖然我都沒接觸過-囧)。另一種就是angular JS採用的方式,每一次Javascript程式碼執行序列執行結束後都會去檢查是否有資料的改變。這看起來似乎不高效,甚至嚴重影響性能。但是angular JS採用了一些比較巧妙的手段解決了這個問題(還沒研究過,目前尚不清楚)。這麼做的好處就是,我們可以隨便使用任意對象,對於賦值方式也沒有限制,而且對於資料的改變也能覺察。
對於angular JS所採取的這種解決方案,我們關心的是何時資料發生了變化,而這也正是scope.apply()派上用場的地方。對於檢查綁定的資料到底有沒有發生變化,實際上是由scope.digest()完成的,但是我們幾乎從來就沒有直接呼叫過這個方法,而是呼叫scope.apply()方法,是因為在scope .apply()方法裡面,它會去呼叫scope.digest()方法。 scope.apply()方法帶一個函數或一個表達式,然後執行它,最後呼叫scope.digest()方法去更新bindings或watchers。
何時用$apply()
還是那個問題,那我們到底什麼時候需要去呼叫apply()方法呢?情況非常少,實際上幾乎我們所有的程式碼都包在scope.apply()裡面,像ng−click,controller的初始化,http的回調函數等。在這些情況下,我們不需要自己調用,實際上我們也不能自己調用,否則在apply()方法裡面再調用apply()方法會拋出錯誤。如果我們需要在一個新的執行序列中運行程式碼時才真正需要用到它,而且當且僅當這個新的執行序列不是被angular JS的庫的方法創建的,這個時候我們需要將程式碼用scope. apply()包起來。下面用一個例子解釋:
functionCtrl($scope) {
$scope.message ="Waiting 2000ms for update";
setTimeout(function () {
$scope.message ="Timeout called!";
// AngularJS unaware of update to $scope
}, 2000);
}
上面的程式碼執行後頁面上會顯示:Waiting 2000ms for update。顯然數據的更新並沒有被angular JS覺察到。
接下來,我們將Javascript的程式碼稍作修改,並用scope.apply()包起來。
functionCtrl($scope) {
$scope.message ="Waiting 2000ms for update";
setTimeout(function () {
$scope.$apply(function () {
$scope.message ="Timeout called!";
});
}, 2000);
}
這次與之前不同的是,頁面上先會顯示:Waiting 2000ms for update,等待2秒後內容會被更改為:Timeout called! 。顯然數據的更新被angular JS覺察到了。
NOTE:我們不應該這樣做,而是用angular JS提供的timeout方法,這樣它就會被自動用apply方法包起來了。
科學是把雙面刃
最後,我們再來瞅一眼scope.apply()和scope.apply(function)方法!雖然angular JS為我們做了很多事情,但我們也因此失去了一些機會。從下面的偽代碼一看便知:
function$apply(expr) {
try {
return$eval(expr);
} catch(e) {
$exceptionHandler(e);
} finally {
$root.$digest();
}
}
它會捕捉所有的例外並且不會再拋出來,最後都會呼叫$digest()方法。
總結一下
$apply()方法可以在angular框架之外執行angular JS的表達式,例如:DOM事件、setTimeout、XHR或其他第三方的函式庫。這只是個開始,水還有很深,歡迎大家一起來deep dive!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Javascript 是一個非常有個性的語言. 無論是從程式碼的組織, 還是程式碼的程式設計範式, 或物件導向理論都獨具一格. 而很早就在爭論的Javascript 是不是物件導向語言這個問題, 顯然已有答案. 但是, 即使Javascript 叱吒風雲二十年, 如果想要看懂jQuery, Angularjs, 甚至是React 等流行框架, 觀看《黑馬雲課堂JavaScript 高級框架設計視頻教程》就對了。

在現今資訊時代,網站已成為人們獲取資訊和交流的重要工具。一個響應式的網站能夠適應各種設備,為使用者提供優質的體驗,成為了現代網站開發的熱點。本篇文章將介紹如何使用PHP和AngularJS建立響應式網站,進而提供優質的使用者體驗。 PHP介紹PHP是一種開源的伺服器端程式語言,非常適合Web開發。 PHP具有許多優點,如易於學習、跨平台、豐富的工具庫、開發效

隨著網路的不斷發展,Web應用已成為企業資訊化建設的重要組成部分,也是現代化工作的必要手段。為了讓Web應用能夠方便開發、維護和擴展,開發人員需要選擇適合自己開發需求的技術框架和程式語言。 PHP和AngularJS是兩種非常流行的Web開發技術,它們分別是伺服器端和客戶端的解決方案,透過結合使用可以大大提高Web應用的開發效率和使用體驗。 PHP的優勢PHP

隨著Web技術的快速發展,單頁Web應用程式(SinglePageApplication,SPA)已成為越來越流行的Web應用程式模型。相較於傳統的多頁Web應用程序,SPA的最大優勢在於使用者感受更加流暢,同時伺服器端的運算壓力也大幅減少。在本文中,我們將介紹如何使用Flask和AngularJS來建構一個簡單的SPA。 Flask是一款輕量級的Py

這篇文章介紹的內容是關於AngularJS基礎入門介紹,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下。

隨著Web應用程式的普及,前端框架AngularJS變得越來越受歡迎。 AngularJS是一個由Google開發的JavaScript框架,它可以幫助你建立具有動態Web應用程式功能的網頁應用程式。另一方面,對於後端編程,PHP是非常受歡迎的程式語言。如果您正在使用PHP進行伺服器端編程,那麼結合AngularJS使用PHP將可以為您的網站帶來更多的動態效

隨著網路的普及,越來越多的人使用網路進行檔案傳輸和分享。然而,由於各種原因,使用傳統的FTP等方式進行檔案管理無法滿足現代使用者的需求。因此,建立一個易用、高效、安全的線上文件管理平台已成為了一種趨勢。本文介紹的線上文件管理平台,基於PHP和AngularJS,能夠方便地進行文件上傳、下載、編輯、刪除等操作,並且提供了一系列強大的功能,例如文件共享、搜尋、

隨著網路的普及和發展,前端開發已變得越來越重要。身為前端開發人員,我們需要了解並掌握各種開發工具和技術。其中,PHP和AngularJS是兩種非常有用且受歡迎的工具。在本文中,我們將介紹如何使用這兩種工具進行前端開發。一、PHP介紹PHP是一種流行的開源伺服器端腳本語言,它適用於Web開發,可以在Web伺服器和各種作業系統上運作。 PHP的優點是簡單、快速、便
