我只想在我的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();
});
只是增加該節點不輸出任何socket.io握手調試消息,其被導通。 – arve0
您是否已將console.log語句添加到您的控制器定義中以確保它正在實例化(與工廠相同)?也可以在一些調試器中下降;所以鉻檢查員將在控制器和工廠中斷,看看每個值都是你期望的。 – shaunhusain
是的,我也試着用console.log命令進行調試。在上面添加一個,在下面添加一個。兩者都輸出。我還檢查了套接字變量已保存(將套接字對象輸出到控制檯)。儘管我的調試技巧在此停止:/ – arve0