2013-05-10 103 views
31

我已經能夠讓控制器使用$ on監聽器 和$scope.$on

但我沒有看到關於如何獲得服務來監聽事件的任何文檔。我試過$rootScope.$on,但只允許一個監聽者。我希望聽衆在多個服務中,不管他們的父控制器是否在範圍內。

+0

你爲什麼不乾脆注入到服務控制器和讓控制器調用的服務方法。你不需要使用任何事件。 (順便說一句,服務不會被創建,如果你不注入某物...) – Tosh 2013-05-10 08:55:58

+0

我有多個控制器,他們每個都有服務,所有的服務都需要通知。而不僅僅是活動的控制器 – Anton 2013-05-10 11:41:06

+0

@Anton:默認情況下服務是單身 - 所以在一個控制器中更改服務變量會改變它到處(因爲它是同一個對象)。 – ganaraj 2013-05-10 15:02:40

回答

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 2014-05-12 21:42:52

+0

@BradGreens,我覺得它困惑自己app.factory被列爲定義角度服務的「一種方式」。很高興能被證明是正確的做法,如果這是不正確的 – Anton 2014-05-12 23:00:53

+0

是的,我與你同在。我主要是使用'app.service'作爲使用'this'屬性的真正單身人士。我可以在明天直接將這個'工廠'移植到'服務'上,希望能幫助勾畫出它們之間的差異。老實說,我可以在應用程序中與工廠交換每項服務,並且看不到最終結果的差異。 – BradGreens 2014-05-13 03:05:31

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 2013-05-10 23:06:58

+0

如果你不建議這種方法,你會做什麼呢? – marcel 2014-03-12 08:27:33

+0

@marcel,我喜歡安東的方法/回答。 (當我第一次寫這個答案時,我想不出一個更好的方法。) – 2014-03-12 15:54:06