2013-06-05 18 views
20

異なるスコープを持つ100種類のビューを持つngViewを使用している場合。 Angularは自動的に古いテンプレート/スコープを破棄したり、それらがメモリに残ったりしますか?私が行く前にAngularがこれを処理するのは興味深いだけです。メモリ負荷を減らすためにカスタムコードを書くことを始めます。現時点では、私が新しいビューを見るたびにメモリに積み重ねられます。AngularjsはngViewでメモリ管理をどのように処理しますか?

これはAngularJS固有の質問です。私はガベージコレクションがjavascriptでどのように動作するかを知っています。

+5

はい、jsにガベージコレクションがあります。しかし、使用されていると考えられるものは収集しません。角度を指定すると、$スコープはまだ使用されているとみなされます。したがって、スコープは決して収集されません。だから私はそれが収集されることを確認するために私がAngularで何をする必要があるかを尋ねています。 – mfrancis107

+0

「削除」はいつでも使えますか? –

+0

@KGChristensenそれは 'delete'の仕組みではないのですか? – rounce

答えて

22

スコープを導入した後の設計上の決定の1つは、メモリ管理を容易にすることでした。モデルのスペースをサブパーツ(スコープ)に分割することで、不要なモデル部分(スコープ)を削除し、必要なときに新しいものを追加することができます。そう、はい、スコープは全体のメモリ管理のパズルの重要な一部です。

ng-viewについての特定の質問については、のアクティブビューの有効範囲がのままです。 ng-viewは、スコープ作成(およびスコープ破壊!)指令の1つです。新しいビューがナビゲートされると自動的に新しいスコープが作成され、古いビューに関連付けられたスコープが自動的に破棄されます。これはAngularJS source codeで簡単に確認できます。

考慮する必要があるのは、ネットワーク経由でテンプレートを取得することだけです。あるルートで参照されているテンプレートはすべて$templateCacheにキャッシュされています。あなたのアプリケーションで特定のperfボトルネックに取り組んでいると判断した場合、テンプレートを控えめに退避させることができます。我々は、それがメモリ消費のための時間(ネットワーク時間)であることを認識する必要があります。

簡潔に:ng-viewの独自のスコープ管理を展開する必要はありません。スコープの保持がある場合は、バグとして報告する必要があります。

+0

テンプレートのhtmlについてはどうですか?私はテンプレートを別のAjaxリクエストすることはないので、それを保持していることは分かっていますか? – mfrancis107

+0

はい、フェッチされたテンプレートはすべて '$ templateCache'に入れられます:http://docs.angularjs.org/api/ng.$templateCacheルート変更イベントでそれらを追い出すことができます。答えを更新しました。 –

+1

hi @ pkozlowski.opensource分離スコープを作成するユーザー定義ディレクティブはどうでしょうか? –