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