我有$ 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?
答案 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');
});