chieffancypants / angular-hotkeys

Configuration-centric keyboard shortcuts for your Angular apps.
http://chieffancypants.github.io/angular-hotkeys/
MIT License
1.68k stars 248 forks source link

'action' on a keybinding prevents callbacks on subsequent keybindings with same 'combo' #195

Open jwm opened 8 years ago

jwm commented 8 years ago

I define a hotkey in Controller A like so:

hotkeys.bindTo($scope).add({
    combo: 's',
    action: 'keydown',
    description: 'Do a thing',
    callback: function (event, hotkey) { /* profit! */ }
}

and a different hotkey in Controller B in the same way, except I omit the action:

hotkeys.bindTo($scope).add({
    combo: 's',
    description: 'Do a different thing',
    callback: function (event, hotkey) { /* profit in another way! */ }
}

I load (in a web browser) an Angular route that uses only Controller A, then click a link to view a different route that uses only Controller B.

The hotkey works fine in the Controller A route, but does not work in Controller B's. The cheat sheet shows the hotkey in both cases, with the correct description for the respective controller. Once I remove the action on the first hotkey, the second hotkey starts working.

This feels like something is wrong when scrubbing the scope's keybinding state. I don't have a proof of concept (this behavior is in a much larger app), but please let me know if I can help. I'm using Angular 1.3.15 (a little old, but we haven't had a chance to upgrade) and the latest version of angular-hotkeys.

edenpessach commented 8 years ago

+1 I believe I am experiencing the same thing using directives with bind logic (multiple directives = binds to the same keys) only binds and work for one of them.

DioNNiS commented 8 years ago

+1 Issue present event when events are in the same controller.

hotkeys.bindTo($scope)
    .add({
        combo: 's',
        action: 'keydown',
        description: 'Do a thing 1',
        callback: function (event, hotkey) { 
            console.log('s - keydown');
        }
    })
    .add({
        combo: 's',
        action: 'keyup',
        description: 'Do a thing 2',
        callback: function (event, hotkey) { 
            console.log('s - keyup');
        }
    });

I believe solution already provided in https://github.com/chieffancypants/angular-hotkeys/pull/193

ntrpnr commented 8 years ago

+1 experiencing the same problem with combo: 'shift' for action: 'keydown' and action: 'keyup'

Edit:

It actually works if I add the 'keyup' action before I add the 'keydown' action.