12

以下はangularのドキュメントです。のフィルター文字列を構築するために、このスコープの一部であるいくつかの変数を監視していますng-grid。このスコープが破棄されている場合、からの戻り値を呼び出して監視$scope.$watchを解除する必要がありますか、それともスコープの破棄で十分ですか? 監視されている変数がこのスコープの一部ではない場合はどうなりますか?

スコープと共に破棄されている変数を「ウォッチ解除」しないと、メモリ リークやパフォーマンスの問題が発生しますか。


$destroy()

親スコープから現在のスコープ (およびそのすべての子) を削除します。削除は、への呼び出しが$digest()現在のスコープとその子に伝播されなくなることを意味します。削除は、現在のスコープがガベージ コレクションの対象であることも意味します。

は通常、ループの展開を管理する$destroy()などのディレクティブによって使用されます。ngRepeat

スコープが破棄される直前に、$destroyこのスコープでイベントがブロードキャストされます。アプリケーション コードは$destroy、必要なクリーンアップを実行する機会を与えるイベント ハンドラーを登録できます。

AngularJS には$destroy、要素が DOM から削除される前に DOM バインディングをクリーンアップするために使用できる jQuery イベントもあります。

4

2 に答える 2

18

ソース コードをざっと見てみると、 によって返された削除関数が特別なことを$watchしていないことがわかります。scope.$$watchers配列からアイテムを削除するだけです。

そのため、スコープが破棄されると、配列全体がそれに伴い、ガベージ コレクターがすべてをクリーンアップします。

何を見ているかに関係なく、時計自体はスコープに格納されています。これが、 を使用するために を$watch呼び出すangular.$watchのではなく、 を呼び出す理由です$scope.$watch

于 2013-12-21T16:17:51.647 に答える
1

また、これはドキュメントで明示的に説明する必要があると思います。私は、scope.$watch(ngIf、ngShow、ngRepeatなどで)の結果を常に無視するAngularソースコードから、監視を解除する必要はないと推測しました。

于 2013-12-21T07:11:55.347 に答える