2013-05-10 5 views
31

私はリスナー の$を$scope.$onで使用するようにコントローラを取得できました。

しかし、イベントを受信するサービスを取得する方法に関するドキュメントはありません。

私は$rootScope.$onを試しましたが、それは1つのリスナーしか許可しません。親のコントローラが有効範囲内にあるかどうかにかかわらず、複数のサービスでリスナーが必要です。 $on以来

+0

なぜあなたは、単にコントローラにサービスを注入し、コントローラは、サービスメソッドを呼び出してみましょういけません。イベントを使用する必要はありません。あなたが何かに注入しないと、サービスが作成されません。 – Tosh

+0

私は複数のコントローラを持っており、それぞれにサービスがあり、すべてのサービスに通知する必要があります。アクティブなコントローラーだけではありません。 – Anton

+0

@Anton:サービスはデフォルトではシングルトンです。つまり、1つのコントローラーでサービス変数を変更すると、同じオブジェクトから変更されます。 – ganaraj

答えて

45

公正なビットを試した結果、サービスへのイベントを最小限のコードで処理できることが判明しました。

他に誰かがこの問題に遭遇した場合のサンプルサービスコードです。

サンプルは、ローカルストレージにサービスモデルを保存し、復元することは、それぞれのブロードキャストを取得します

app.factory('userService', ['$rootScope', function ($rootScope) { 

    var service = { 

     model: { 
      name: '', 
      email: '' 
     }, 

     SaveState: function() { 
      sessionStorage.userService = angular.toJson(service.model); 
     }, 

     RestoreState: function() { 
      service.model = angular.fromJson(sessionStorage.userService); 
     } 
    } 

    $rootScope.$on("savestate", service.SaveState); 
    $rootScope.$on("restorestate", service.RestoreState); 

    return service; 
}]); 
+1

私は唯一これは技術的にはファクトリオブジェクトであることを知っていますか?それは 'app.service( 'myActualService'、...)でサービスコンストラクタを呼び出しません。 – BradGreens

+0

@BradGreens、私は自分自身を困惑させるそのapp.factoryは、角度のあるサービスを定義する「方法」としてリストされています。これが間違っていると正しい方法で表示されてうれしいです – Anton

+0

うん、私はあなたと一緒です。私はたいていの場合、 'this'プロパティを使う本当のシングルトンのための' app.service'ユーザです。私はこの「工場」を明日の 'サービス'に移植して、その違いの概要を助けることを期待してショットを取ることができます。正直なところ、私のアプリケーションでは、すべてのサービスを工場と交換することができ、最終結果に違いは見られません。 – BradGreens

14

は、あなたがそれにイベントをリッスン、その後、あなたのサービスにスコープを作成することができ、スコープの方法である:

app.factory('myService', function($rootScope) { 
    var scope = $rootScope.$new(); // or $new(true) if you want an isolate scope 
    scope.$on('testEvent', function() { 
     console.log('event received'); 
    }) 
    return {} 
}); 

function MyCtrl($scope, myService, $rootScope) { 
    $rootScope.$broadcast('testEvent'); 
} 

fiddle

しかし、私は以来、このアプローチをお勧めしませんスコープは通常サービスに関連付けられていません。

+2

が合意しました。サービスのスコープを使用することが好奇心のようです。 – Anton

+0

この方法をお勧めしない場合は、代わりに何をしますか? – marcel

+0

@marcel、私はAntonのアプローチ/答えが好きです。 (私が最初にこの答えを書いたとき、私はより良い方法を考えることができませんでした) –

関連する問題