2016-08-01 26 views
0

Ich benutze React-Keydown-Bibliothek zum Hinzufügen von Tastenkombinationen zu meiner Anwendung, kann aber nicht in innere Dialoge Komponenten arbeiten. Die Dialoge sind nicht immer sichtbar, aber ich erwarte, dass die Tasten funktionieren, wenn sie sichtbar sind. ich bin immer zu event_handlers.js._onKeyDown (event) Methode, aber mit fehlendem Wert: fn = undefined, während fn sollte die eingerichtete Funktion enthalten.fangen Keydown-Ereignisse in inneren Komponenten mit react-keydown

Meine Komponenten wie folgt aussieht:

<Container> 
    <MyDialog> 
     <material-ui-dialog/> 
    </MyDialog> 
</Container> 

Container.js:

import keydown from 'react-keydown' 
class Container extends Component { 
    @keydown('enter') 
    someMethod1(){ 
     // working 
    } 
    render() { 
     return (
     <div> 
      <MyDialog/> 
     </div> 
    ) 
    } 
} 

MyDialog.js:

import keydown, {keydownScoped} from 'react-keydown' 
@keydown('enter') 
class MyDialog extends Component { 
    @keydownScoped('enter') 
    someMethod3(){ 
     // not working 
    } 
} 
+0

Welche Logik bestimmt, ob es sichtbar ist oder nicht? Können Sie außerdem bestätigen, dass Sie nicht versuchen, die keygebundene Methode auszulösen, wenn Sie sich auf ein Formularfeld konzentrieren? – glortho

+0

Der Dialog ist nicht immer sichtbar. Es handelt sich um einen Bestätigungsdialog (der einen Material-Dialog enthält), der durch eine andere Aktion in der Komponente ausgelöst wird. Es gibt kein Eingabefeld oder Textbereich in der Komponente, nur ein Dialog mit OK/Abbrechen-Schaltflächen. – user1813302

+0

Wird es montiert, auch wenn es nicht sichtbar ist? Das Problem könnte sein, dass, wenn es bereits gemountet, aber versteckt ist, und Sie auf eine Komponente außerhalb des Bereichs der Dialogkomponente klicken oder eine Tabulatortaste drücken, die Tastaturbelegung nicht reagiert. – glortho

Antwort

0

Basierend auf Ihrer Beschreibung in den Kommentaren, wird das Problem Seien Sie, dass Ihre Dialog-Komponenten mounten und dann den Fokus verlieren, so dass alle Tastenbelegungen in ihnen den Tastendruck nicht erhalten s. Sie haben einige Optionen:

1) Erweitern Sie den Umfang der Tastenkürzel, indem Sie eine Komponente dekorieren, die ein Vorfahre Ihrer Dialog-Komponenten ist und den Fokus nicht verliert. Im Extremfall könnte dies die Hauptkomponente Ihrer App sein. Dann dekorieren Sie die gewünschte Dialog-Komponentenmethode mit keydownScoped. Innerhalb dieser Methode untersuchen Sie die Requisiten, um sicherzustellen, dass der aktuelle Dialog der aktive ist.

2) Programmatisch aktivieren Sie Ihre Dialog Tastenbelegung in diesem Fall https://github.com/glortho/react-keydown/issues/28.

Hoffe, dass hilft!