我socket.on电话为什么乘每当我recenter我的控制器 [英] Why do my socket.on calls multiply whenever i recenter my controller
问题描述
我一直在使用这里由布赖恩·福特在这里描述的套接字工厂
http://www.html5rocks.com/en/tutorials/frameworks/angular-的WebSockets /
这里是工厂
myApp.factory('插座',函数($ rootScope){
VAR插座= io.connect('URL');
返回{
于:功能(eventName的,回调){
socket.on(eventName的,函数(){
变参=参数;
$ rootScope。$应用(函数(){
callback.apply(插座,参数);
});
});
},
发出:功能(eventName的,数据,回调){
socket.emit(eventName的,数据功能(){
变参=参数;
$ rootScope。$应用(函数(){
如果(回调){
callback.apply(插座,参数);
}
});
})
}
};
});
我有一个socket.emit在我的控制器初始化函数,每当我从另一个页面重新进入该控制器接收socket.on函数执行+1倍。出现这种情况,直到我手动刷新页面,然后重置为1。我不明确我的存储会话插座。所以,这可能是导致我socket.on调用多次。
下面是我socket.emt我的控制器
这始终执行一次。
$ scope.init =功能可按(){
...
socket.emit('getSignedSlidesFromUrl',$ scope.slideLocation);
}
下面是我的socket.on,将收到getSignedSlidesFromUrl
socket.on('signedUrls',函数(signedSlides){
的console.log('signedUrls插座命中');
$ scope.slides = signedSlides;
的console.log($ scope.slides [0]);
的console.log($ scope.display);
});
下面是再次进入控制器后我的控制台日志的例子
即将由init controllers.js发出getSignedSlidesFromUrl:71
显示后调用$ scope.first幻灯片IS0 controllers.js:574
flash对象是controllers.js:537
signedUrls插座命中controllers.js:816
0 controllers.js:823
signedUrls插座命中controllers.js:816
0 controllers.js:823
如果我重新输入控制器再次我的日志将变为
signedUrls插座命中controllers.js:816
0 controllers.js:823
signedUrls插座命中controllers.js:816
0 controllers.js:823
signedUrls插座命中controllers.js:816
0 controllers.js:823
您必须removeAllListeners添加到您的工厂(见下文),并且具有以下code在每个控制器:
$范围。在$('$破坏',函数(事件){
socket.removeAllListeners();
});
更新套接字工厂:
VAR插座= io.connect('URL');
返回{
于:功能(eventName的,回调){
socket.on(eventName的,函数(){
变参=参数;
$ rootScope。$应用(函数(){
callback.apply(插座,参数);
});
});
},
发出:功能(eventName的,数据,回调){
socket.emit(eventName的,数据功能(){
变参=参数;
$ rootScope。$应用(函数(){
如果(回调){
callback.apply(插座,参数);
}
});
})
},
removeAllListeners:功能(eventName的,回调){
socket.removeAllListeners(eventName的,函数(){
变参=参数;
$ rootScope。$应用(函数(){
callback.apply(插座,参数);
});
});
}
};
});
I've been using the socket factory described here by the brian ford here http://www.html5rocks.com/en/tutorials/frameworks/angular-websockets/
here is the factory 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);
}
});
})
}
};
});
I have a socket.emit in my controllers initialization function and whenever i reenter this controller from another page the receiving socket.on function executes +1 times. This happens until I manually refresh the page then it resets to 1. I don't explicitly store my socket in session. So what could be causing my socket.on to call multiple times.
Here is my socket.emt in my controller this always executes once.
$scope.init = funciton (){
...
socket.emit('getSignedSlidesFromUrl', $scope.slideLocation);
}
Here is my socket.on that will be recieve 'getSignedSlidesFromUrl'
socket.on('signedUrls', function (signedSlides){
console.log('signedUrls socket hit');
$scope.slides = signedSlides;
console.log($scope.slides[0]);
console.log($scope.display);
});
Here is an example of my console log after reentering the controller
about to emit getSignedSlidesFromUrl from init controllers.js: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
if I reenter the controller again my log would change to
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
You have to add removeAllListeners to your factory (see below) and have the following code in each of your controllers:
$scope.$on('$destroy', function (event) {
socket.removeAllListeners();
});
Updated socket factory:
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);
});
});
}
};
});
这篇关于我socket.on电话为什么乘每当我recenter我的控制器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!