我socket.on电话为什么乘每当我recenter我的控制器 [英] Why do my socket.on calls multiply whenever i recenter my controller

查看:83
本文介绍了我socket.on电话为什么乘每当我recenter我的控制器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在使用这里由布赖恩·福特在这里描述的套接字工厂
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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆