2016-11-30 144 views
0

使用Angular.js(1.x)。

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

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

  1. 获取听众列表。
 
> $scope.$root.$$listeners 
    Object 
    $locationChangeSuccess: Array[1] 
    __proto__: Object 
  • 添加cat听者上$rootScope
  •  
    > var dog = $scope.$root.$on("cat", function() {}); 
    undefined 
    
  • 验证cat侦听加入。
  •  
    > $scope.$root.$$listeners 
        Object 
        $locationChangeSuccess: Array[1] 
        cat: Array[1] 
        __proto__: Object 
    
  • 注销,通过调用dog功能。
  •  
    > dog() 
    undefined 
    
  • 检查cat侦听器是空的/除去。不。
  •  
    > $scope.$root.$$listeners 
        Object 
        $locationChangeSuccess: Array[1] 
        cat: Array[1] // ???? I would expect this to be 0 now 
        __proto__: Object 
    
  • 在情况下,它是一个未应用的消化循环问题。
  •  
    > $scope.$root.$apply() 
    undefined 
    
  • 检查cat侦听器是空的/除去。不。
  •  
    > $scope.$root.$$listeners 
        Object 
        $locationChangeSuccess: Array[1] 
        cat: Array[1] // Nope. 
        __proto__: Object 
    

    回答

    0

    因此该事件被注销。但是,$$listeners数组属性未被清除。通常$$listeners数组属性将包含回调函数,但注销后它将被替换为null。

    此行为是有关的,因为当您注册/取消注册监听器数组将继续增长。我不确定是否在某个时候收集垃圾。

     
    > $scope.$root.$$listeners["cat"] 
    [null, null, function]