在一个角度控制器中,我附加到一个 websocket 服务。当控制器范围被破坏时,我显然想删除订阅。
将当前范围传递给我的服务订阅功能是否安全,以便它可以在范围销毁时自动删除?如果我不这样做,那么每个连接到套接字侦听器的控制器也必须记得清理。
基本上将当前 $scope 传递给服务函数是否安全,或者有更好的方法吗?
在一个角度控制器中,我附加到一个 websocket 服务。当控制器范围被破坏时,我显然想删除订阅。
将当前范围传递给我的服务订阅功能是否安全,以便它可以在范围销毁时自动删除?如果我不这样做,那么每个连接到套接字侦听器的控制器也必须记得清理。
基本上将当前 $scope 传递给服务函数是否安全,或者有更好的方法吗?
我的项目中有类似的需求。下面是 AngularJS 工厂(初始化 WebSocket)中返回的对象。如果您在第二个参数中传入它的关联,该onmessage
方法会自动取消订阅 a 。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);
}
};
我不会通过范围。相反,我会在您的控制器中明确连接取消订阅。
来自http://odetocode.com/blogs/scott/archive/2013/07/16/angularjs-listening-for-destroy.aspx:
$scope.$on("$destroy", function() {
if (timer) {
$timeout.cancel(timer);
}
});
我认为明确地做到这一点并不那么神奇,而且更容易遵循逻辑。我认为如果它也取消订阅,该服务将做得太多。如果控制器想提前取消订阅怎么办?
但是,如果您确实有一个在任何地方都使用的非常具体的用例,那么将范围传入就可以了。服务需要范围的时间非常短,基本上是在控制器第一次执行以便服务可以侦听时到 $destroy 事件。