安全地将当前$ scope从控制器传递到angularjs服务功能

时间:2013-08-13 16:12:01

标签: angularjs angularjs-scope sockjs

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

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

基本上将当前$ scope传递给服务函数是安全的还是有更好的方法呢?

2 个答案:

答案 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事件。