關於Angularjs中的$apply及最佳化使用
這篇文章主要為大家介紹了關於Angularjs中$apply及優化使用的相關資料,文中透過範例程式碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧
前言
對於一個在前端屬於純新手的我來說,Javascript都還是一知半解,要想直接上手angular JS,遇到的阻力還真是不少。不過我相信,只要下功夫,即使是反人類的設計也不是什麼大的問題。
今天,我們要聊得是Angularjs中的小明星$apply。當我們資料更新了,但是view層卻沒反應時,總是能聽到有人說,用apply吧,然後,懵懂無知的我們,在賦值程式碼後面加了$scope.$apply()
,然後就驚喜的發現。噢,真的更新了。
然而,有些時候,編譯器會無情的給你回傳
Error: $digest already in progress
那麼,導致這些現象的原因時又是什麼的呢? $apply究竟做了啥?聽我慢慢到來。
一.$apply的作用
#$apply()函數可以從Angular框架的外部讓表達式在Angular上下文內部執行。
上面是AngularJs權威教學中的一句話。什麼意思呢?
首先,你要清楚,在原生js或第三方框架下,修改model,是有可能不會觸發視圖更新的,例如setTimeout、jquery外掛。為什麼?因為他們脫離了Angularjs的上下文,Angularjs並不能監聽到資料的改變。看例子。
1.setTimeout
html:
#<p>{{name}}</p>
$scope.name="张三"; setTimeout(function(){ $scope.name = '李四'; //$scope.$apply() },500)
$scope.$apply()放開,就正常了,張三成功變成李四。
2.第三方外掛程式
html:#
<p>Date: <input type="text" id="datepicker"></p> <p> <header>所选日期</header> {{selectedDate}} </p>
$scope.selectedDate = ''; $( function() { $( "#datepicker" ).datepicker({ onClose: function( selectedDate ) { $scope.selectedDate = selectedDate; // $scope.$apply(); } }); } );
其實$apply相當於一個觸發器,它的作用就是觸發digest循環,從而更新視圖。
在digest是Angularjs的核心,是它實作了神奇的資料綁定。凡是觸發事件,必會觸發digest循環,比如,我們數值的ng事件,click啊,change,實際上都是觸發了digest循環。 所以,我們所做的事,其實就是手動觸發了digest循環。關於digest循環,屬於題外話,這裡不做太多介紹,想深入了解的同學,可以看看書籍,或百度。二.更好地運用digest循環
#在Angularjs中,除了$apply可以觸發digest循環外,還有其他的方法,也可以觸發此循環。而且$apply往往時最壞的選擇。下面推薦一些更好的選擇。1.$digest
$scope.$digest()的速度要比$apply快,因為它只更新當前作用域和子作用域的值,對於父作用域時不管的。而$apply還要評估父作用域,這就大大消耗了效能。
2.$timeout
用$timeout去取代你的setTimeout,$timeout作為Angularjs的自帶服務,當然時更契合Angularjs環境啦。它會隱性觸發digest循環,而且它會延遲執行,會在上一個digest循環完成後的下一刻,觸發digest循環,這樣就不會出現上文所說的$digest already in progress
$timeout(function(){ $scope.name = '李四'; },500)
3.$evalAsync
最推薦的應該時這個方法了。如果目前剛好有一個digest循環在執行,那麼它就會把導致digest循環的操作,放到當前digest循環中去執行。而$timeout是要等到目前digest循環執行完,再執行一次digest循環才可以。所以evalAsync執行更快,效能更好。我們可以像$timeout那樣去呼叫它,也就是$scope.$evalAsync( function( $scope ) { console.log( "$evalAsync" ); } );
#
以上是關於Angularjs中的$apply及最佳化使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱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)

Angular.js是一種可自由存取的JavaScript平台,用於建立動態應用程式。它允許您透過擴展HTML的語法作為模板語言,以快速、清晰地表示應用程式的各個方面。 Angular.js提供了一系列工具,可協助您編寫、更新和測試程式碼。此外,它還提供了許多功能,如路由和表單管理。本指南將討論在Ubuntu24上安裝Angular的方法。首先,您需要安裝Node.js。 Node.js是一個基於ChromeV8引擎的JavaScript運行環境,可讓您在伺服器端執行JavaScript程式碼。要在Ub

我們在收到新電腦後要怎麼設定優化效能,使用者可以直接的開啟隱私和安全性,然後點擊常規(廣告ID,本地內容,應用程式啟動,設定建議,生產力工具或直接的開啟本地群組策略編輯器來進行操作就可以了。下面就讓本來為用戶們來仔細的介紹一下Win11新電腦收到後如何優化設置提升性能的方法吧。Win11新電腦收到後如何優化設置提升性能的方法方法一:1、按【Win+i】組合鍵,開啟設置,然後左側點選【隱私與安全性】,右側點選Windows權限下的【常規(廣告ID,本地內容,應用程式啟動,設定建議,生產力工具)】。方法二

解碼Laravel效能瓶頸:優化技巧全面揭秘! Laravel作為一個受歡迎的PHP框架,為開發者提供了豐富的功能和便利的開發體驗。然而,隨著專案規模增加和訪問量增加,我們可能會面臨效能瓶頸的挑戰。本文將深入探討Laravel效能最佳化的技巧,幫助開發者發現並解決潛在的效能問題。一、資料庫查詢優化使用Eloquent延遲載入在使用Eloquent查詢資料庫時,避免

Angular框架中元件的預設顯示行為不是區塊級元素。這種設計選擇促進了元件樣式的封裝,並鼓勵開發人員有意識地定義每個元件的顯示方式。透過明確設定CSS屬性 display,Angular組件的顯示可以完全控制,從而實現所需的佈局和響應能力。

Laravel是一款廣受歡迎的PHP開發框架,但有時候被人詬病的就是其速度慢如蝸牛。究竟是什麼原因導致了Laravel的速度不盡人意呢?本文將從多個面向深入解讀Laravel速度慢如蝸牛的原因,並結合具體的程式碼範例,幫助讀者更深入地了解此問題。 1.ORM查詢效能問題在Laravel中,ORM(物件關係映射)是一個非常強大的功能,可以讓

時間複雜度衡量演算法執行時間與輸入規模的關係。降低C++程式時間複雜度的技巧包括:選擇合適的容器(如vector、list)以最佳化資料儲存和管理。利用高效演算法(如快速排序)以減少計算時間。消除多重運算以減少重複計算。利用條件分支以避免不必要的計算。透過使用更快的演算法(如二分搜尋)來優化線性搜尋。

Golang的垃圾回收(GC)一直是開發者關注的熱門話題。 Golang作為一門快速的程式語言,其自帶的垃圾回收器能夠很好地管理內存,但隨著程式規模的增大,有時會出現一些效能問題。本文將探討Golang的GC最佳化策略,並提供一些具體的程式碼範例。 Golang中的垃圾回收Golang的垃圾回收器採用的是基於並發標記-清除(concurrentmark-s

Laravel效能瓶頸揭秘:優化方案大揭秘!隨著網路技術的發展,網站和應用程式的效能優化變得愈發重要。作為一款流行的PHP框架,Laravel在開發過程中可能會面臨效能瓶頸。本文將探討Laravel應用程式可能遇到的效能問題,並提供一些最佳化方案和具體的程式碼範例,讓開發者能夠更好地解決這些問題。一、資料庫查詢最佳化資料庫查詢是Web應用中常見的效能瓶頸之一。在
