javascript - AngularJS:取消订阅事件

标签 javascript angularjs events listener broadcast

在我的一个 Controller 中,有一条指令 <div keypress-events>订阅按下的键:

directives.directive('keypressEvents', ['$document', '$rootScope',  function ($document, $rootScope) {
    return {
        restrict: 'A',
        link: function () {
            $document.bind('keydown', function (e) {
                $rootScope.$broadcast('keypress', e, e.which);
            });
        }
    }
}]);

还有一个监听器,当用户按下任意箭头键时执行分页。

var listener = $scope.$on('keypress', function (e, a, key) {
    $scope.$apply(function () {
        $scope.key = key;

        if (key == 39) {
            $scope.currentPage = Math.min($scope.currentPage + 1, $scope.numPages)
        } else if (key == 37) {
            $scope.currentPage = Math.max($scope.currentPage - 1, 1)
        }
    });
})

但是,当您导航到另一个 Controller 然后返回时,监听器将被调用两次。那么我怎样才能取消订阅该事件呢?

我只是尝试销毁监听器,但这不起作用......

$scope.$on('$destroy', function() {
  listener(); // remove listener.
});  

最佳答案

因为当您重新访问页面时,指令中的 keydown 事件会被限制两次。您可以做的是,在离开页面之前,注意删除 指令的 keydown 事件,与 scope$destroy 事件 Hook 。

代码

directives.directive('keypressEvents', ['$document', '$rootScope',  function ($document, $rootScope) {
    return {
        restrict: 'A',
        link: function (scope) {
            var event =  function (e) {
                $rootScope.$broadcast('keypress', e, e.which);
            };
            $document.on('c', event);
            scope.$on('$destroy', function (){
                angular.element($document).off('keydown', event);
            })
        }
    }
}]);

Note: As of jQuery 3.0, .unbind() has been deprecated. It was superseded by the .off() method since jQuery 1.7, so its use was already discouraged.

关于javascript - AngularJS:取消订阅事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45390902/

相关文章:

javascript - 最合适的数据结构是什么? (使用带有间隙的数组是否有缺点或注意事项?)

javascript - 我可以通过 API 调用在 AngularJS 中动态创建路由吗?

angularjs - 为什么 ChartJS 图表最终的宽度为 0,高度为 0?

java - Java 中的事件监听器和处理程序有什么区别?

java - 当提醒时间到期时自动事件触发。可以使用 hibernate 来完成吗?

c# - 以编程方式触发控件的事件

javascript - 如何将angularjs变量值赋给html元素属性,比如input元素的name属性

java - 类(java)和闭包(javascript)之间的区别?

javascript - 使用socket.io更新express实时 View

ASP.NET MVC 5 与 AngularJS/ASP.NET WebAPI