在角度控制器中,我附加到websocket服务。当控制器范围被销毁时,我显然想要删除订阅。
将当前范围传递给我的服务订阅功能是否安全,以便它可以自动删除范围销毁?如果我不这样做,那么每个连接到套接字监听器的控制器也必须记得要清理。
基本上将当前$ scope传递给服务函数是安全的还是有更好的方法呢?
答案 0 :(得分:4)
我的项目中有类似的需求。下面是AngularJS工厂(初始化WebSocket)中返回的对象。如果您在第二个参数中传入关联的onmessage
,则callback
方法会自动取消订阅scope
。
io =
onmessage: (callback, scope) ->
listeners.push callback
if scope then scope.$on "$destroy", => @offmessage callback
offmessage: (callback) -> listeners.remove callback
JavaScript等价如下。
var io = {
onmessage: function(callback, scope) {
var _this = this;
listeners.push(callback);
if (scope) {
scope.$on("$destroy", function() {
_this.offmessage(callback);
});
}
},
offmessage: function(callback) {
listeners.remove(callback);
}
};
答案 1 :(得分:2)
我不会通过范围。相反,我会明确地在您的控制器中挂钩取消订阅。
来自http://odetocode.com/blogs/scott/archive/2013/07/16/angularjs-listening-for-destroy.aspx:
$scope.$on("$destroy", function() {
if (timer) {
$timeout.cancel(timer);
}
});
我认为明确地完成这项工作并不是那么神奇,也更容易遵循逻辑。我认为如果要取消订阅,服务也会做得太多。如果控制器想要提前取消订阅该怎么办?
但是,如果你确实有一个在任何地方使用的非常具体的用例,那么传递范围就可以了。服务需要范围的时间非常小,基本上当控制器首次执行时,服务可以收听$ destroy事件。