2015-09-08 96 views
0

我試圖在作爲事件處理程序傳遞給angular.element($window).on()的函數中,在我的AngularJS指令中解除綁定事件。AngularJS - 在同一個函數中的綁定事件綁定?

從這個問題,我已經認識到,僅僅從目前的指令解除綁定,相同的事件處理程序必須被傳遞到兩個angular.element().on()angular.element().off()

AngularJS - Unbind $window of an event from specific directive

這是我的控制器方法中由指令返回的對象;

controller: function($scope, $element) { 
      var eventHandler = function() { 
       var windowBottom = $window.pageYOffset + $window.innerHeight; 
       var elementBottom = $element[0].getBoundingClientRect().bottom; 
       if (windowBottom > elementBottom) { 
        console.log($scope.stockID, this); 
        angular.element($window).off('scroll', this.bind(this)); 
       } 
      }; 
      angular.element($window).on('scroll', eventHandler.bind(eventHandler)); 
     } 

任何幫助理解爲什麼這是無法解除事件將不勝感激!

注:我最初試圖只是eventHandler傳遞到兩個.on().off()功能,但我意識到,this沒有引用eventHandler功能,因此爲什麼我和.bind(eventHandler)的說法。

+0

一次可以在頁面上有多個控制器。我在這裏看到內存泄漏,如果事件在每次實例化這些控制器時都受到約束,並且沒有任何事物保證它們將被刪除。一旦範圍被銷燬,您也許想要移除該事件。 – arjabbar

回答

0

我立即發現兩件事情是錯誤的。

1)調用bind()返回一個帶有界限值的新函數。

2)第二次調用bind()函數裏面,什麼都不做。

MDN's site

的bind()函數(ECMAScript中5個術語內部呼叫屬性),因爲它是被稱爲上(該函數創建一個新的功能(結合的功能)具有相同功能的體綁定函數的目標函數)綁定到bind()的第一個參數,該值不能被覆蓋。

所以基本上,當你撥打off()你只需要傳入事件名稱。擺脫第二個參數。該處理程序將與最初傳入的處理程序不同,因爲您要對其調用bind()

相關問題