4

在一个角度控制器中,我附加到一个 websocket 服务。当控制器范围被破坏时,我显然想删除订阅。

将当前范围传递给我的服务订阅功能是否安全,以便它可以在范围销毁时自动删除?如果我不这样做,那么每个连接到套接字侦听器的控制器也必须记得清理。

基本上将当前 $scope 传递给服务函数是否安全,或者有更好的方法吗?

4

2 回答 2

4

我的项目中有类似的需求。下面是 AngularJS 工厂(初始化 WebSocket)中返回的对象。如果您在第二个参数中传入它的关联,该onmessage方法会自动取消订阅 a 。callbackscope

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); 
  }
};
于 2013-08-13T20:07:34.700 回答
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 事件。

于 2013-08-13T17:51:46.240 回答