创建单例AngularJS服务时遇到问题
我正在通过第四种方法创建一个。我的服务看起来像创建单例AngularJS服务时遇到问题,angularjs,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/sock
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
在$get方法中继续为null
。我的控制器正在按预期初始化套接字
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的服务实现。如果您需要全局对象(即单例对象),为什么不简单地将其实例附加到
$rootScope
?这样,您就可以确定您正在访问的实例,而不必围绕Angular的服务实现进行工作。@Laurent-这是一个伟大的想法!我正在寻找将$rootScope
注入服务的方法。还不能让它工作,但仍在调查…@Laurent-让它工作了。。。你能把它作为一个答案贴出来,这样我就可以接受了吗?好的,完成了,很高兴听到它有帮助。