Клавиша Shift ведет себя как клавиша Caps Lock в ngx-material-keyboard

Я использую ngx-material-keyboard в своем приложении Angular.
Я заметил, что клавиша Shift ведет себя странно при нажатии/нажатии:

  • ожидается: после изменения представления букв в нижнем регистре на прописные, при нажатии на одну из этих букв в верхнем регистре клавиатура автоматически переключается обратно в нижний регистр
  • наблюдалось: после изменения представления букв в нижнем регистре на прописные, при нажатии одной из этих букв в верхнем регистре клавиатура остается в верхнем регистре (клавиша Shift ведет себя идентично клавиша Caps Lock)

Мои ожидания исходят от экранных клавиатур на моем телефоне (например, в чат-приложениях). Являются ли мои обоснованными ожидания и оправдано ли мое раздражение?

Воспроизведите его здесь: демонстрация ngx-material-keyboard

Насколько я вижу, никто не создавал проблему, которую я считаю странно, поэтому я сначала спрашиваю здесь (и, кажется, никто не обратился к этому и в SO).

Кто-нибудь знает, как это исправить? (Я разветвил репозиторий, поэтому я могу изменить код , но, к сожалению, я не могу понять, как происходит переключение регистра букв и как заставить обработчик сдвига переключаться на верхний регистр только одним кликом, а не постоянно.)

Вот части кода, которые я считаю актуальными:

В клавиатуре.components.ts:

public onShiftClick(): void {
    this.modifier = MatKeyboardComponent.invertShiftModifier(this.modifier);
    this.shiftClick.next();
}

private static invertShiftModifier(modifier: KeyboardModifier): KeyboardModifier {
    switch (modifier) {
        case KeyboardModifier.None:
            return KeyboardModifier.Shift;

        case KeyboardModifier.Alt:
            return KeyboardModifier.ShiftAlt;

        case KeyboardModifier.ShiftAlt:
            return KeyboardModifier.Alt;

        case KeyboardModifier.Shift:
            return KeyboardModifier.None;
    }
}

И в файле keyboard-key-component.ts:

public onClick(event: MouseEvent): void {
[...]

// TODO: if current modifier is KeyboardModifier.Shift
// do the invert
}

person jasie    schedule 12.02.2019    source источник
comment
Кстати: виртуальная клавиша Shift ведет себя нормально (как и ожидалось), когда вы используете клавишу Shift на реальной клавиатуре, когда открыта клавиатура ngx-material (попробуйте это со связанной демонстрацией).   -  person jasie    schedule 12.02.2019


Ответы (1)


Я сам смог найти работающее решение.
Функция onClick() уже предоставляет this.genericClick.emit(event). Этот эмиттер можно использовать для сброса смены после нажатия на одну клавишу. Решение также работает правильно, если активен режим Caps Lock.

В файле keyboard.component.html добавьте genericClick:

<vwlmz-keyboard-key class="mat-keyboard-col"
    [...]
    (enterClick)="onEnterClick()"
    (genericClick)="onKeyClick()" // add this line
    (capsClick)="onCapsClick()"
    (altClick)="onAltClick()"
    (shiftClick)="onShiftClick()"></vwlmz-keyboard-key>

В файле keyboard.component.ts добавьте следующее:

public enterClick: EventEmitter<void> = new EventEmitter<void>();

public onKeyClick(): void {
    this.genericClick.next();

    // reset shift after clicking a key
    if (this.modifier === KeyboardModifier.Shift) {
        this.modifier = MatKeyboardComponent.invertShiftModifier(KeyboardModifier.Shift);
    }
}
person jasie    schedule 13.02.2019
comment
Скорее всего, вы захотите условно имитировать onKeyClick внутри onKeyUp. В противном случае модификатор shift не будет инвертирован при вводе с клавиатуры. Кроме того, вы можете расширить эту логику umschalten, чтобы также учитывать модификатор alt. - person Jota.Toledo; 13.02.2019
comment
@ Jota.Toledo Что касается вашего второго пункта: вы имеете в виду такое изменение? если (this.modifier === KeyboardModifier.Shift || this.modifier === KeyboardModifier.ShiftAlt) - person jasie; 13.02.2019
comment
@ Jota.Toledo Спасибо за ваши предложения. Что касается вашего первого пункта: реальное поведение сдвига клавиатуры уже работало правильно. Я не могу создать проблему при смешивании ввода с реальной клавиатуры и ввода с виртуальных клавиш. - person jasie; 13.02.2019
comment
Если я правильно понял источник, в случае активации модификатора shift через виртуальную клавиатуру, он не будет деактивирован после нажатия клавиши на нативной. Хотя не уверен, что это проблема для вас. - person Jota.Toledo; 13.02.2019
comment
В зависимости от ваших требований вы можете деактивировать модификатор alt после нажатия клавиши. По сути, продублируйте логику модификатора выпуска внутри onKeyUp внутри вашего onKeyClick - person Jota.Toledo; 13.02.2019