2013-05-10 12 views
31

Sono stato in grado di ottenere il controller per utilizzare l'$ listener con $scope.$on.

ma non vedo alcuna documentazione su come ottenere servizi per l'ascolto di eventi.

Ho provato $rootScope.$on, ma ciò consente solo un ascoltatore. Voglio gli ascoltatori in più servizi indipendentemente dal fatto che i loro controllori principali siano o meno nell'ambito di applicazione.

+0

Perché non è sufficiente iniettare il servizio in controllo e lasciare controller di chiamata del metodo di servizio. Non è necessario utilizzare alcun evento. (A proposito, il servizio non verrà creato se non si inietta qualcosa ...) – Tosh

+0

Ho più controller e ognuno di essi ha dei servizi, tutti i servizi devono essere notificati. non solo il controller attivo – Anton

+0

@Anton: i servizi sono singletons per impostazione predefinita, quindi la modifica di una variabile di servizi in un controller lo cambierà ovunque (poiché è lo stesso oggetto). – ganaraj

risposta

45

dopo aver sperimentato un bel po 'si scopre che ottenere eventi per il servizio può essere fatto con un codice minimo.

codice di servizio di esempio nel caso in cui qualcun altro si imbattesse in questo.

Il campione salva e ripristina il modello di servizio per la memorizzazione locale quando si arriva alle rispettive trasmissioni

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

Sono l'unico a notare che questo è tecnicamente un oggetto factory .... non chiama un costruttore di servizi con 'app.service ('myActualService', ...)' – BradGreens

+0

@BradGreens, trovo che si stia in imbarazzo quella app.factory è elencata come "un modo" per definire i servizi in angolare. felice di essere mostrato il modo giusto per farlo se questo non è corretto – Anton

+0

Sì, sono con voi. Per lo più user 'app.service' per veri singleton che usano proprietà' this'. Posso dare una occhiata direttamente al porting di questo 'factory' a un' servizio' domani nella speranza che aiuti a delineare la differenza. Onestamente, potrei scambiare ogni servizio con una fabbrica nella mia applicazione e non vedere una differenza nel risultato finale. – BradGreens

14

Dal $on è un metodo ambito, si potrebbe creare un ambito nel vostro servizio, allora ascolto per gli eventi su di esso:

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

Comunque, io non consiglierei questo approccio, dal momento che gli ambiti non sono normalmente associati ai servizi.

+2

d'accordo, usare uno scope in un servizio sembra curioso – Anton

+0

Se non consigli questo approccio, cosa faresti invece? – marcel

+0

@marcel, mi piace l'approccio/risposta di Anton. (Quando ho scritto per la prima volta questa risposta, non potevo pensare a un modo migliore.) –