Aus*_*vis 2 sockets socket.io angularjs
我一直在使用brian ford这里描述的套接字工厂 http://www.html5rocks.com/en/tutorials/frameworks/angular-websockets/
这是工厂myApp.factory('socket',function($ rootScope){
var socket = io.connect('url');
return {
on: function (eventName, callback) {
socket.on(eventName, function () {
var args = arguments;
$rootScope.$apply(function () {
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);
}
});
})
}
};
});
Run Code Online (Sandbox Code Playgroud)
我的控制器初始化函数中有一个socket.emit,每当我从另一个页面重新进入该控制器时,接收socket.on函数执行+1次.这种情况发生在我手动刷新页面然后重置为1.我没有明确地将我的套接字存储在会话中.那么什么可能导致我的socket.on多次调用.
这是我的控制器中的socket.emt总是执行一次.
$scope.init = funciton (){
...
socket.emit('getSignedSlidesFromUrl', $scope.slideLocation);
}
Run Code Online (Sandbox Code Playgroud)
这是我的socket.on将收到'getSignedSlidesFromUrl'
socket.on('signedUrls', function (signedSlides){
console.log('signedUrls socket hit');
$scope.slides = signedSlides;
console.log($scope.slides[0]);
console.log($scope.display);
});
Run Code Online (Sandbox Code Playgroud)
以下是重新输入控制器后我的控制台日志的示例
即将从init controllers.js发出getSignedSlidesFromUrl:71
display after called $scope.first slide is0 controllers.js:574
flash object is controllers.js:537
signedUrls socket hit controllers.js:816
0 controllers.js:823
signedUrls socket hit controllers.js:816
0 controllers.js:823
Run Code Online (Sandbox Code Playgroud)
如果我再次重新进入控制器,我的日志将更改为
signedUrls socket hit controllers.js:816
0 controllers.js:823
signedUrls socket hit controllers.js:816
0 controllers.js:823
signedUrls socket hit controllers.js:816
0 controllers.js:823
Run Code Online (Sandbox Code Playgroud)
小智 7
您必须将removeAllListeners添加到工厂(见下文)并在每个控制器中包含以下代码:
$scope.$on('$destroy', function (event) {
socket.removeAllListeners();
});
Run Code Online (Sandbox Code Playgroud)
更新套接字工厂:
var socket = io.connect('url');
return {
on: function (eventName, callback) {
socket.on(eventName, function () {
var args = arguments;
$rootScope.$apply(function () {
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);
}
});
})
},
removeAllListeners: function (eventName, callback) {
socket.removeAllListeners(eventName, function() {
var args = arguments;
$rootScope.$apply(function () {
callback.apply(socket, args);
});
});
}
};
});
Run Code Online (Sandbox Code Playgroud)