创建单例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-让它工作了。。。你能把它作为一个答案贴出来,这样我就可以接受了吗?好的,完成了,很高兴听到它有帮助。