2016-11-20 100 views
1

我正在使用AngularJS,並且我想在DOM完全呈現時運行一​​些操作。
看來我可以觀看'$ viewContentLoaded'事件或在文檔上使用jQuery'ready'方法。

這兩種方法中的哪一種是最佳方法,爲什麼?

var myapp = angular.module('myapp', []) 
.run(function($document, $rootScope) { 

    $rootScope.$on('$viewContentLoaded', function() { 
     console.log('view content loaded'); 
    }); 

    $document.ready(function() { 
     console.log('document ready');    
    }); 
}); 
+1

我添加了一個答案來試圖描述這些差異,但是當我寫這個答案的時候,我發現這個*看起來像*一個[XY問題](http://meta.stackexchange.com/questions/66377 /是什麼 - 是最XY-問題/ 66378#66378)。 「當DOM完全呈現時運行一​​些動作」具有很多不同的含義,並且絕大多數都是通過角度自動處理的....如果我的回答沒有說​​明您的擔憂,那麼您可能需要更新這個問題以***爲例,你首先擔心DOM。 – Claies

回答

2

$document.ready()是Angular以外的調用,發生時一次當DOM準備好執行JavaScript時。它在$location的變化中不被Angular調用。因此,與Angular相關的此功能的唯一用途是如果您想手動使用angular.bootstrap()。由於Angular必須等待$document.ready(),即使使用ng-app,控制器也應該處理除手動引導以外的任何代碼。

$viewContentLoaded是一個角度事件,它是ng-route module的一部分。無論何時重新加載ng-view元素的內容,它都會由ngView發出。該事件是角度感知的,這意味着它會導致一個摘要循環,並且由於觀看此事件而執行的任何代碼都將影響內容視圖。此外,每次加載新路線時,此事件都會發出,與僅發射一次的$document.ready()不同。通常,如果您的目標是在應用程序啓動時初始化變量,那麼在控制器中初始化它們是安全的選擇。如果您的目標是在每次渲染新視圖時初始化變量,則通常可以在控制器中爲每個視圖執行,但$viewContentLoaded是合理的後備。應該幾乎從不與Angular應用程序一起使用,因爲它不是角度感知函數。

1

如果你看看他們的定義,$rootscope是您從開始您的應用程序的基礎範圍。另一方面,$document代表整個javascript window.document

然後,包含您應用程序的DOM部分可能會準備就緒,但不是整個文檔。

我應該注意到,在大多數網絡應用程序(至少我看到的那些)中,$ rootcope位於身體標籤上,在這種情況下,它幾乎是相同的。