【问题标题】:Event handlers being duplicated when changing routes更改路由时复制的事件处理程序
【发布时间】:2015-08-12 14:53:14
【问题描述】:

这些数据以每秒 30 次左右的速度传入,并通过这些事件处理程序提供给我的应用程序。我为此使用 btford.socket-io,而 0MQ 负责将数据传输到我的 node.js 服务器。

我已经跟踪了来自节点服务器的数据,并意识到它是正确的,所以重复实际上是在 Angular 端发生的。

基本上发生的情况是,每次我离开视图并返回视图时,所有事件的触发次数都是以前的两倍。

在btford API Reference中,他给出了使用的建议

socket.forward('dataUpdate', $scope);
$scope.$on('socket:dataUpdate', function(ev, data) {
   $scope.someVar1 = data;
   $scope.someVar2 = data;
   $scope.someVar3 = data;
   $scope.someVar4 = data;
});

这有助于另一种情况。但是,正如我所说,在这种情况下,该事件每秒被调用 30 次并处理 4 次,因为有 4 个变量。所以每次我改回显示这些变量的路线时,不是做 4 次工作,而是做 8 次,然后是 12、16 次,然后继续。这样一来,我就会出现内存泄漏,最终浏览器崩溃。

有没有人对我如何使它变得更好有任何想法?

【问题讨论】:

    标签: angularjs node.js events socket.io zeromq


    【解决方案1】:

    事件监听器永远不会被直接移除,你需要强行移除它们。 $destroying 控制器时需要注销监听器

    代码

    socket.forward('dataUpdate', $scope);
    var socketEvent = $scope.$on('socket:dataUpdate', function(ev, data) {
       $scope.someVar1 = data;
       $scope.someVar2 = data;
       $scope.someVar3 = data;
       $scope.someVar4 = data;
    });
    
    $scope.$on('$destroy', function(){
       socketEvent(); //deregistering event while destroying controller scope.
    })
    

    【讨论】:

    • @felipefss 很高兴为您提供帮助..谢谢 :)
    猜你喜欢
    • 2016-12-31
    • 2016-05-29
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2015-04-14
    • 1970-01-01
    相关资源
    最近更新 更多