javascript - 如何清除从 Controller 分配的事件?

标签 javascript angularjs events socket.io angularjs-controller

何时何处如何当 Controller 不再相关时,我应该摆脱旧的事件监听器?

考虑 SPA有两条路线:/login/loggedin

app.factory('socket', ['$window', function(window) {
    return window.io();
}]);
app.controller('loginController', ['socket', function (socket) {
    this.tryLogin = function(credentials) {
        socket.emit('login', credentials);
    }
    sokcet.on('loginResponse', function(data) {
        if (data.status == 'OK') {
            // Navigate to loggedInController
        } else {
            // Show error message and keep listening - user might try again
        }
    });
}]);
app.controller('loggedInController', ['socket', function (socket) {/* Logged in, but loginController is still listening for loginResponse */}]);

问题:

  • 当导航到 /loggedin 时,loginResponse 事件保持监听
  • 当导航回 /login 页面时,添加了 new 监听器(实际上我现在有 2 个监听器)

最佳答案

看看 Angular 的 $scope.$on('$destroy')事件并将其与 socket.io 的 removeListener 一起使用方法。像这样:

app.controller('loginController', ['$scope', 'socket', function ($scope, socket) {
    this.tryLogin = function(credentials) {
        socket.emit('login', credentials);
    }

    socket.on('loginResponse', loginResponse);

    $scope.$on('$destroy', function() {
        socket.removeListener('loginResponse', loginResponse);
    });

    function loginResponse(data) {
        if (data.status == 'OK') {
            // Navigate to loggedInController
        } else {
            // Show error message and keep listening - user might try again
        }
    }
}]);

关于javascript - 如何清除从 Controller 分配的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32035157/

相关文章:

javascript - jquery fancybox 触发点击只工作一次

javascript - 单击按钮时执行 Node 命令

javascript - 如何包含 AngularJS 的标签

javascript - Ext JS DisplayField如何更改动态加载的值

javascript - 在 Vanilla JavaScript 中调用函数播放音频文件时如何更改可变音频文件值?

javascript - 在 Angular 中修改独立范围指令的范围

javascript - Angular JS 使用 $timeout 或 $interval 服务在后台获取信息

javascript - 如何检查服务人员是否离线?

javascript - 通过单击 div 启用/禁用所有音效 - javascript

javascript - $window 打开多个被弹出窗口阻止的链接