2013-12-21 8 views
10

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

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


$破壊()

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

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

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

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

答えて

17

ソースコードを見てみると、$ watchによって返された削除関数がエキゾチックなことをしていないことがわかります。スコープ。$$ watchers配列から項目を削除するだけです。

このように、スコープが破棄されると、配列全体が一緒になり、ガベージコレクタによってすべてが消去されます。

あなたが見ているものに関係なく、時計自体はスコープに保存されています。だから、$ watchを使うためには、$ watchという角度を呼び出すのではなく、$ scopeと呼んでください。

1

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

関連する問題