2
我正在通過第4種方法創建Single AngularJS service。我的服務看起來像......無法創建Singleton AngularJS服務
provider('SocketService', {
socket: null,
// methods used within the config() of a module
connect: function(url) {
if (this.socket == null)
this.socket = portal.open('ws://production.local/socket/'+url);
},
// --------- Public methods for handling this socket -------------------------
$get: function() {
return {
getSocket: function() {
return this.socket;
},
on: function (event, handler) {
if (this.socket == null)
console.error('Unable to call .on() - Socket is not connected');
//if no handler is provided, "event" is an object of handlers...
if (handler == null)
return this.socket.on(event);
return this.socket.on(event, handler);
},
close: function() {
return this.socket.close();
}
};
}
});
this.socket
繼續null
的$ get方法內。我控制器初始化插座預期...
config(['$routeProvider', 'SocketServiceProvider', function($routeProvider, SocketServiceProvider) {
//only initialize the socket when a URL in this route is accessed...
function initSocket() { SocketServiceProvider.connect('workstation/approval'); console.log('connected'); }
/* URL mappings */
$routeProvider.
when('/approval', {templateUrl: '/partials/loading.htm', controller: 'ApprovalCtrl', resolve: {socketInitializer: initSocket}}).
when('/approval/dashboard', {templateUrl: '/partials/approval/dashboard.htm', controller: 'ApprovalCtrl', resolve: {socketInitializer: initSocket}})
}]).
controller('ApprovalCtrl', ['$scope', '$cookieStore', 'WorkflowProcessService', 'WorkstationService', 'SocketService', 'socketUrl', '$location', function ($scope, $cookieStore, WorkflowProcessService, WorkstationService, SocketService, socketUrl, $location) {
/* Handle socket events coming from the server */
console.log(SocketService.getSocket()); //returns null
SocketService.on({
open: function() {
$scope.initializing.message = "Loading dashboard...";
$scope.showDashboard();
},
close: function (reason) {
$scope.initializing.status = true;
$scope.initializing.message = "Connection lost. Reconnecting...";
console.log(reason);
},
updateQueueSize: function (r) {
console.log(r);
}
});
}]);
如果你需要一個全局對象(這是一個單例),爲什麼不簡單地將它的一個實例附加到'$ rootScope'?這樣你就可以確定你正在訪問什麼樣的實例,並且不必爲Angular的服務實現工作。 –
@Laurent - 這是一個偉大的想法!我正在尋找將'$ rootScope'注入到服務中的方法。不能得到它的工作,但仍在調查... – Webnet
@Laurent - 得到它的工作...你可以張貼作爲一個答案,所以我可以接受它? – Webnet