2013-07-21 49 views
2

我只想在我的webapp的一部分中使用socket.io。我使用socket.io的set('authorization',fn)來握手當前上下文(express session和page-id)。這在我刷新當前頁面時效果很好,但當路由由$ location.path(url)處理時不會發生。

Socket.io代碼(視圖控制器):

.controller('ViewCtrl', function ($scope, $routeParams, $http, $location, socket) { 
    socket.connect('', { query: 'id=' + $routeParams.id }); 
    socket.emit('msg', { data: 'key'}); //DEBUG 
    socket.on('connect', function(){ 
    console.log('Socket connected'); 
    }); 
    socket.on('disconnect', function(){ 
    console.log('Socket disconnected'); 
    }); 
    ... 

路由碼(主控制器,頭版):

if (data.owner == "yes") $location.path('/view/' + $scope.id()); 

路由當然是安全的服務器側也。

Socket.io服務:

.factory('socket', function ($rootScope) { 
    var disconnecting = false; 
    var socket = {}; 
    return { 
    connect: function(url, query){ 
     disconnecting = false; 
     socket = io.connect(url, query); 
    }, 
    on: function(eventName, callback){ 
     socket.on(eventName, function(){ 
     var args = arguments; 
     if(!disconnecting){ 
      $rootScope.$apply(function(){ 
      callback.apply(socket, args); 
      }); 
     } 
     else { 
      callback.apply(socket, args); 
     } 
     }); 
    }, 
    emit: function (eventName, data, callback) { 
     socket.emit(eventName, data, function(){ 
     var args = arguments; 
     $rootScope.$apply(function(){ 
      if (callback) { 
      callback.apply(socket, args); 
      } 
     }); 
     }) 
    }, 
    disconnect: function(){ 
     disconnecting = true; 
     socket.disconnect(); 
    }, 
    socket: socket 
    }; 
}); 

我還直接在控制器(無服務),相同的結果使用socket.io嘗試。

控制檯也不會給出任何錯誤。

一個解決方案是使用整個應用程序的socket.io,通信頁面ID等發射。但是,當我在這個「查看頁面」上只需要socket.io時,這看起來很浪費。

編輯: 這是它出錯(不應該忽略這一點):

$scope.$on('$destroy', function (event) { 
    // disconnect socket when leaving page 
    socket.disconnect(); 
}); 
+0

只是增加該節點不輸出任何socket.io握手調試消息,其被導通。 – arve0

+1

您是否已將console.log語句添加到您的控制器定義中以確保它正在實例化(與工廠相同)?也可以在一些調試器中下降;所以鉻檢查員將在控制器和工廠中斷,看看每個值都是你期望的。 – shaunhusain

+0

是的,我也試着用console.log命令進行調試。在上面添加一個,在下面添加一個。兩者都輸出。我還檢查了套接字變量已保存(將套接字對象輸出到控制檯)。儘管我的調試技巧在此停止:/ – arve0

回答

3

Socket.io不會以這樣的方式工作連接() - >斷開() - >連接()。

創建單頁應用程序時,io始終位於命名空間中,並且不會從io.sockets中移除套接字。因此,在第二個連接()上不會創建一個新的套接字。

看行93 socket.io客戶端庫:

if (options['force new connection'] || !io.sockets[uuri]) { 
    socket = new io.Socket(options); 
} 

解決方案,增加 '強制新的連接':

var socket = io.connect('', { 'force new connection': true, query: 'id=' + $routeParams.id }); 

感謝shaunhusain指着我的Chrome調試!

參考:https://github.com/LearnBoost/socket.io-client/issues/251