2015-09-08 56 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()

相关问题