如何清理从控制器分配的事件?
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 的控制器中处理它们?