我試圖更好地理解在Angular中使用$ timeout服務作為一種“安全$ apply”方法的細微差別。基本上是在可以響應Angular事件或非Angular事件(例如jQuery或某些標準DOM事件)而運行一段代碼的場景中。據我了解:在$ scope。$ apply中包裝代碼適用于您尚未處于摘要循環(又稱為jQuery事件)的情況,但如果正在進行摘要則將引發錯誤在$ timeout()調用中包裝沒有延遲參數的代碼無論是否已經在摘要周期中都有效查看Angular源代碼,看起來$ timeout調用了$ rootScope。$ apply()。如果摘要周期已經在進行中,為什么$ timeout()也不會引發錯誤?最好的方法是使用$ scope。$ apply()(當您確定摘要尚未進行時)和$ timeout()(當需要以某種方式確保安全時)?是$ timeout()確實可以接受的“安全應用”,還是有陷阱?感謝您的見解。
3 回答

森林海
TA貢獻2011條經驗 獲得超2個贊
如果我們在應用程序中大量使用$ apply,則可能會出現錯誤:$ digest已經在進行中。這是因為可以一次運行一個$ digest循環。我們可以通過$ timeout或$ evalAsync解決它。
$ timeout不會產生像“ $ digest已經進行中”之類的錯誤,因為$ timeout告訴Angular,在當前周期之后,有一個超時等待,這樣可以確保摘要周期與$輸出之間不會發生任何沖突。超時將在新的$ digest周期執行。
我嘗試在以下位置解釋它們:apply,timeout,digest和evalAsync的比較。
可能會對您有幫助。

四季花海
TA貢獻1811條經驗 獲得超5個贊
據我了解,它$timeout
是一個包裝器,在setTimeout
其周圍隱式調用$scope.$apply
,這意味著它在角度生命周期之外運行,但會啟動角度生命周期本身。我能想到的唯一“陷阱”是,如果您希望結果可用this $digest
,則需要找到另一種“安全應用”的方法(AFAIK僅可通過訪問$scope.$$phase
)。
- 3 回答
- 0 關注
- 589 瀏覽
添加回答
舉報
0/150
提交
取消