2013-05-22 50 views
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); 
     } 
    }); 
}]); 
+0

如果你需要一个全局对象(这是一个单例),为什么不简单地将它的一个实例附加到'$ rootScope'?这样你就可以确定你正在访问什么样的实例,并且不必为Angular的服务实现工作。 –

+0

@Laurent - 这是一个伟大的想法!我正在寻找将'$ rootScope'注入到服务中的方法。不能得到它的工作,但仍在调查... – Webnet

+0

@Laurent - 得到它的工作...你可以张贴作为一个答案,所以我可以接受它? – Webnet

回答

0

如果你需要一个全局对象(这是一个单身是什么),为什么不只是它的一个实例附加到$rootScope

这样你就可以确定你正在访问什么样的实例,并且不需要为Angular的服务实现工作。