2016-11-30 179 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]