如何清理从控制器分配的事件?

Posted

技术标签:

【中文标题】如何清理从控制器分配的事件?【英文标题】:How to clean up events assigned from controller? 【发布时间】:2015-11-09 04:35:09 【问题描述】:

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

考虑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 页面时,监听器被添加(实际上我现在有 2 个监听器)

【问题讨论】:

【参考方案1】:

看看 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
        
    
]);

【讨论】:

现在我对$destory 事件也有同样的问题,不是吗?如果我错了,请纠正我,仍在学习角度.. 哦,$scope 破坏了所有的听众? 当作用域在 Angular 中被销毁时,所有关联的 $on 事件处理程序都是 destroyed along with it。 好的,谢谢楼主,3分钟可以接受答案:)

以上是关于如何清理从控制器分配的事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从视图中触发事件(自定义事件)并在 Ext JS 的控制器中处理它们?

如何从控制器内的事件访问范围?

从 Ember 中的控制器操作返回一个承诺?

如何从事件侦听器内部将数据添加到同步广播 StreamController 到该控制器的 Stream?

JavaScript MVC:视图如何通知控制器

如何从 Firebase 控制台查看事件参数