AngularJS - 同时进行多次按键

Kou*_*sha 3 keypress angularjs

我有以下内容$broadcast来捕获Angular中的按键:

$document.bind('keypress', function(event) {
    var key = event.which;
    $rootScope.$broadcast('keypress', event);
    $rootScope.$broadcast('keypress:' + key, event);
});
Run Code Online (Sandbox Code Playgroud)

我听着 $on

但是,我想检测何时同时按下两个键,比如说enters同时按下(不是一个组合后跟另一个组合).

这样做的最佳方式是什么?

编辑

我在想的是:

var keys = [];
$document.bind('keydown', function(event) {
    keys[event.which] = true;
});
$document.bind('keyup', function(event) {
    delete keys[event.which];
});

$document.bind('keypress', function(event) {
    var key = event.which;
    var keysPressed = [];
    angular.forEach(keys, function(value, key) {
        keysPressed += 'keypress:' + key;
    });
    $rootScope.$broadcast('keypress', event);
    $rootScope.$broadcast(keysPressed, event);
});
Run Code Online (Sandbox Code Playgroud)

所以如果我有多个按键,那么我创建正确的$broadcast.然而,问题在于,订单现在很重要(例如,如果我按下a那么enter,那么$broadcastkeypress:58keypress:13,如果我按另一种方式,我得到keypress:13keypress:58)

sco*_*ott 6

在我看来,广播的使用方式太多了.相反,也许使用自定义指令?这是用户按下Shift+ 的示例,Tab它会触发如下事件:

<input on-shift-tab="prevStep($event,'email')" />
Run Code Online (Sandbox Code Playgroud)
app.directive('onShiftTab', function() {
return function(scope, element, attrs) {
    var map = {9: false, 16: false};

    element.on("keydown", function(event) {
        if (event.which in map) {
            map[event.which] = true;
            if (map[9] && map[16]) {
                scope.$apply(function(){
                    scope.$eval(attrs.onShiftTab, {'$event': event});
                });
                event.preventDefault();
            }
        }
    });
    element.on("keyup", function(event) {
        if (event.which in map) {
            map[event.keyCode] = false;
        }
    });
};
})
Run Code Online (Sandbox Code Playgroud)