我已經能夠讓控制器使用$ on監聽器 和$scope.$on
。
但我沒有看到關於如何獲得服務來監聽事件的任何文檔。我試過$rootScope.$on
,但只允許一個監聽者。我希望聽衆在多個服務中,不管他們的父控制器是否在範圍內。
我已經能夠讓控制器使用$ on監聽器 和$scope.$on
。
但我沒有看到關於如何獲得服務來監聽事件的任何文檔。我試過$rootScope.$on
,但只允許一個監聽者。我希望聽衆在多個服務中,不管他們的父控制器是否在範圍內。
經過實驗證明,事實證明可以用最少的代碼完成對服務的事件。
示例服務代碼如果有其他人遇到此情況,請遵循以下示例服務代碼。
樣品保存和恢復服務模式到本地存儲時,得到的各個廣播
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;
}]);
我是唯一一個注意到這在技術上是工廠對象....它不調用服務構造函數與'app.service('myActualService',...)' – BradGreens 2014-05-12 21:42:52
@BradGreens,我覺得它困惑自己app.factory被列爲定義角度服務的「一種方式」。很高興能被證明是正確的做法,如果這是不正確的 – Anton 2014-05-12 23:00:53
是的,我與你同在。我主要是使用'app.service'作爲使用'this'屬性的真正單身人士。我可以在明天直接將這個'工廠'移植到'服務'上,希望能幫助勾畫出它們之間的差異。老實說,我可以在應用程序中與工廠交換每項服務,並且看不到最終結果的差異。 – BradGreens 2014-05-13 03:05:31
由於$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');
}
不過,我不會推薦這種方法,因爲範圍通常不與服務相關聯。
你爲什麼不乾脆注入到服務控制器和讓控制器調用的服務方法。你不需要使用任何事件。 (順便說一句,服務不會被創建,如果你不注入某物...) – Tosh 2013-05-10 08:55:58
我有多個控制器,他們每個都有服務,所有的服務都需要通知。而不僅僅是活動的控制器 – Anton 2013-05-10 11:41:06
@Anton:默認情況下服務是單身 - 所以在一個控制器中更改服務變量會改變它到處(因爲它是同一個對象)。 – ganaraj 2013-05-10 15:02:40