$ scope。如果我去另一页,我会两次点火

时间:2017-05-31 09:30:15

标签: angularjs

我有$ scope。$ on('keypress'在我的角度应用程序的两个页面上...当我重新加载它时效果很好,但如果我转到另一页,它会开始两次射击。没有控制台错误。发生了什么事?

.directive('keypressEvents', ['$document', '$rootScope', function ($document, $rootScope) {
    function link($scope, $element, $attrs) {
        //console.log($document, $element, $scope, $attrs);
        $document.bind('keypress', function (e) {
            //console.log(e.key);
            var key = String.fromCharCode(e.which);
            if (key == 1 || key == 2 || key == 3 || key == 4 || key == 5 || key == 6) {
                //alert(key);
                $rootScope.$broadcast('keypress', e, e.which);
            }
        });
    }

    return {
        link: link
    };
}]);

我想这可能是因为$ document.bind?

2 个答案:

答案 0 :(得分:3)

您正在使用全球范围注册您的活动,即$ rootScope

   "$rootScope.$broadcast('keypress', e, e.which);"

因此,当您移动到其他页面时,您的$ rootScope保持不变并注册另一个侦听器。因此,两者都在同时尝试使用此

$scope.$broadcast 

答案 1 :(得分:1)

重点是你在$ document上绑定'keypress'事件。如果你两次调用指令,观察到的行为似乎是正常的,每次按键动作你将获得2次调用。

您可以仅使用:

绑定主控制器中的事件,而不是将其用作指令
$document.bind('keypress', function (e) {
        //console.log(e.key);
        var key = String.fromCharCode(e.which);
        if (key == 1 || key == 2 || key == 3 || key == 4 || key == 5 || key == 6) {
            //alert(key);
            $rootScope.$broadcast('keypress', e, e.which);
        }
    });

然后,如果您离开主控制器(在您离开应用程序时应该发生这种情况),请不要忘记取消绑定文档:

$scope.$on("$destroy", function() {
        $document.unbind('keypress');
    });