2013-05-10 7 views
31

Udało mi się uzyskać kontroler do użycia $ na odbiorniku z $scope.$on.

, ale nie widzę żadnej dokumentacji, w jaki sposób uzyskać usługi do nasłuchu zdarzeń.

Próbowałem $rootScope.$on, ale to pozwala tylko jeden słuchacz. Chcę słuchaczy w wielu usługach, niezależnie od tego, czy ich nadrzędne kontrolery są w zasięgu, czy nie.

+0

Dlaczego nie wystarczy wstrzyknąć usługi do kontrolera i pozwól wezwanie kontrolera metoda usługa. Nie musisz używać żadnego wydarzenia. (BTW, usługa nie zostanie utworzona, jeśli nie wstrzykniesz czegoś ...) – Tosh

+0

Mam wielu kontrolerów i każdy z nich ma usługi, wszystkie usługi muszą zostać powiadomione. nie tylko kontroler, który jest aktywny – Anton

+0

@Anton: Usługi są domyślnie - tak więc zmiana zmiennej usług w jednym kontrole zmieni ją wszędzie (ponieważ jest to ten sam obiekt). – ganaraj

Odpowiedz

45

Po przeprowadzeniu pewnego eksperymentu okazuje się, że pobieranie zdarzeń do usługi można wykonać przy minimalnym kodzie.

przykładowy kod serwisowy podąża w przypadku, gdy ktoś inny na to wpisze.

Próbka zapisuje i przywraca modelu obsługi do pamięci lokalnej, gdy robi się poszczególne audycje

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

Jestem jedynym, który zauważy, że jest to technicznie obiekt fabryczny .... nie wywołuje konstruktora usługi z 'app.service ('myActualService', ...)' – BradGreens

+0

@BradGreens, uważam to za kłopotliwe ta app.factory jest wymieniona jako "droga" do definiowania usług pod kątem. z radością, że pokazany jest właściwy sposób, aby to zrobić, jeśli jest to niepoprawne. – Anton

+0

Tak, jestem z tobą. W większości używam 'app.service' dla prawdziwych singletonów, które używają własności' this'. Mogę zrobić zdjęcie bezpośrednio, przenosząc tę ​​"fabrykę" do "usługi" jutro w nadziei, że pomoże to w zarysowaniu różnicy. Szczerze mówiąc, mogłem zamienić każdą usługę z fabryką w mojej aplikacji i nie widziałem różnicy w wyniku końcowym. – BradGreens

14

Od $on to metoda zakres, można utworzyć obszar w swojej służbie, a następnie słuchać na imprezach na nim:

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

Jednak nie polecam tej metody, ponieważ zakresy zwykle nie są powiązane z usługami.

+2

zgodzili się, używając zakresu w usłudze wydaje się ciekawy – Anton

+0

Jeśli nie polecisz tego podejścia, co byś zrobił zamiast tego? – marcel

+0

@marcel, podoba mi się podejście/odpowiedź Antona. (Kiedy po raz pierwszy napisałem tę odpowiedź, nie mogłem wymyślić lepszego sposobu). –

Powiązane problemy