更改路由时事件处理程序被复制

Event handlers being duplicated when changing routes

我以每秒大约 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 次,然后继续。因此,我遇到了内存泄漏,最终浏览器崩溃了。

有人对我如何改进它有任何想法吗?

事件侦听器永远不会被直接删除,您需要强行删除它们。您需要在 $destroying controller

时注销监听器

代码

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.
})