2013-05-22 59 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的服務實現工作。