2013-05-02 19 views
9

$ rootScope関数とサービスの実装の違いは何ですか?賢明なセキュリティまたはパフォーマンス。

私はthisを読みましたので、私は疑問に思っています。

私は、自分のアプリケーションの特定のグローバル関数が、サービスまたは$ rootScope自体に最もよく実装されるかどうかを調べようとしています。私が作っていることのアイデアを聞いてみるために、私は現在、ユーザーが特定のフォームから移動するかどうかをユーザーに促すダーティフォーム機能を開発中です。この場合、私はそれをグローバル関数として実装することを決定しました。応答のための

おかげで、私はグローバルな状態を避けるためにサービスのために行くだろう。この場合

+0

参照:http://stackoverflow.com/a/35411623/2893073 – Eddy

答えて

8

。すべての新しいスコープは$ rootScopeから作成されます。新しいコントローラーまたはスコープを使用するユーザーは、$rootscopeの値を使用できます。例えば、$rootScope.validate()を定義し、コントローラーで関数$scope.validate()を定義すると、最初の定義を忘れるため、何かが間違っています。 $ rootScopeは、ブートストラップ中に作成され、あなたがそれらを必要な場所に注入することができるのに対し、

は、オンデマンドでinstantiantedされている。このhttp://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/

サービスについてMisko H.による記事があります。これはテスト容易性に優れています。

Angularは、アプリケーションによって直接的または間接的に要求されない限り、サービスをインスタンス化しません。

http://docs.angularjs.org/guide/dev_guide.services.creating_services

3

として@egamonal言及したサービスは、共通の機能を共有するために、より堅牢な方法です。サービスはオンデマンドでインスタンス化されるだけでなく、本質的にシングルトンなので、サービスが作成されると、要求されるたびに同じインスタンスがAngularJSによって渡されます。したがって、何かがルートスコープになることができれば、サービスを使用して実装することもできます。

このようなグローバルなアプローチを使用することを念頭におくと、メモリリークの可能性があると思います。あなたがグローバル関数($ rootscopeまたはserviceのいずれか)からそれらを参照したため、JSクラスのインスタンスまたは多分DOM要素はメモリに残っています。

+0

rootscopeについては、私が約束をつぶす必要はありません。私がappユーザーを持っている場合、$ rootScope.appUserに裾を保つことができます。$ rootScope.appUser.firstNameが変更された場合、私は購読する必要はなく、イベントを出す必要はありません。Firs Name:{{appUser.firstName}}任意のビュー。私は何かが恋しいですか? – Toolkit