取消注册AngularJs(1.x)$ rootScope事件监听器不会清理$$监听器?

时间:2016-11-30 17:08:02

标签: javascript angularjs

使用Angular.js(1.x)。

$rootScope上取消注册事件侦听器似乎不会从$$listeners属性数组中删除侦听器。我错过了什么吗?

我在这里使用$scope.$root来访问$rootScope

  1. 获取听众列表。
  2. > $scope.$root.$$listeners  
      Object  
        $locationChangeSuccess: Array[1]  
        __proto__: Object
    
    1. cat上添加$rootScope监听器。
    2. > var dog = $scope.$root.$on("cat", function() {});  
      undefined
      
      1. 验证cat侦听器已添加。
      2. > $scope.$root.$$listeners
          Object
            $locationChangeSuccess: Array[1]
            cat: Array[1]
            __proto__: Object
        
        1. 通过调用dog函数取消注册。
        2. > dog()  
          undefined
          
          1. 检查cat侦听器是否为空/已删除。不。
          2. > $scope.$root.$$listeners
              Object
                $locationChangeSuccess: Array[1]
                cat: Array[1] // ???? I would expect this to be 0 now
                __proto__: Object
            
            1. 如果是未应用的摘要周期问题。
            2. > $scope.$root.$apply()  
              undefined
              
              1. 检查cat侦听器是否为空/已删除。不。
              2. > $scope.$root.$$listeners
                  Object
                    $locationChangeSuccess: Array[1]
                    cat: Array[1] // Nope.
                    __proto__: Object
                

1 个答案:

答案 0 :(得分:0)

因此该事件已取消注册。但是,不会清除$$listeners数组属性。通常,$$listeners数组属性将包含回调函数,但在取消注册后,它将替换为null。

此行为令人担忧,因为当您注册/取消注册侦听器时,阵列将继续增长。我不确定它是否在某个时刻被垃圾收集。

> $scope.$root.$$listeners["cat"]
[null, null, function]
相关问题