2013-05-10 3 views
31

Я смог получить контроллер, чтобы использовать $ on listener с $scope.$on.

но я не вижу никакой документации о том, как получить услуги для прослушивания событий.

Я пробовал $rootScope.$on, но это позволяет только одному слушателю. Я хочу, чтобы слушатели находились в нескольких службах независимо от того, находятся ли их родительские контроллеры в области действия или нет.

+0

Почему бы вам не просто вводить услугу в контроллер и пусть контроллер вызова метода обслуживания. Вам не нужно использовать какое-либо событие. (BTW, служба не создаётся, если вы не вводите что-то ...) – Tosh

+0

У меня есть несколько контроллеров, и у каждого из них есть службы, все службы должны быть уведомлены. а не только активный контроллер – Anton

+0

@Anton: Сервисы по умолчанию являются одноточечными, поэтому изменение переменной сервисов в одном контроллере будет меняться повсеместно (с тех же самых объектов). – 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

Да, я с тобой. Я в основном пользователь 'app.service' для истинных синглетонов, которые используют свойства' this'. Я могу сделать попытку немедленно портировать эту «фабрику» на «сервис» завтра в надежде, что это поможет наметить разницу. Честно говоря, я мог бы обменять каждую услугу на завод в моем приложении и не видеть разницы в конечном результате. – BradGreens

14

Поскольку $on способ охвата, вы можете создать сферу вашей службы, а затем прослушивать события на нем:

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, мне нравится подход Антона/ответ. (Когда я впервые написал этот ответ, я не мог придумать лучшего способа.) –

Смежные вопросы