Angular判斷 DOM Render 是否完成

on 2023-08-27

最近有遇到一個需求,是判斷頁面的捲軸是否到底,但有個不一様的點是會開啟 Dialog 後,才動態戴入內容再判斷捲軸是否到底,也就是需要判斷 DOM 是否 戴入完成,但碰到難題,Angular 並沒有像是 Vue.js 般有 $trick方法,可以得知 Dom render 已完成。當查看 StackOverFlow 都是建議使用 ngAfterViewChecked,但經過測試後,覺得同時使用 ngOnChangesngAfterViewChecked後會比較好,分享一下我的做法。

如同程式範例,Component (app-childred) 屬性content,會於 main.ts點擊按鈕時,才會取得要顯示的內容。因為這時ngAfterViewInit已經執行了,而 div 的內容尚未截入,所以 div 的高度為零,也就是scrollHeightInit 為零。

程式寫法如下:

  • ngOnChanges判斷屬性content的值是否有改變,有改變的話,設定Flagtrue

  • 因為每次 Change Detection 都會執行ngAfterViewChecked,到這一步生命周期時代表 Dom render 已完成,也就是 div 的內容已截入完成,而如此可以取得 div 的高度。

  • 取得 div 高度後,進行後續的處理,取得捲軸的高度,來判斷是否捲軸到底。

結論

使用 ngOnChangesngAfterViewChecked這 2 個生命週期來判斷,經過測試後覺得很不錯,符合目前的需求,如果大家覺得可以調整的地方,可以提出來。