C# Blazor: Как предотвратить указание c клавиши на вводе, как в JS с помощью e.preventDefault ()? - PullRequest
3 голосов
/ 22 февраля 2020

Проблема кажется очень простой, но я пока не нашел решения. У меня есть Blazor Input с событием onkeydown:

<input @onkeydown="@(e => KeyWasPressed(e))" 
@onkeydown:preventDefault="@PreventDefault" 
id="@GetId()" 
name="@GetId()" 
@bind-value="@InputValue" 
@bind-value:event="oninput" />

Пользователь должен писать текст, но с помощью клавиш со стрелками пользователь должен перемещаться по списку (поэтому я пытаюсь предотвратить перемещение курсора в верх и конец текста).

В JavaScript это может быть примерно так:

function KeyWasPressed(e)
{
    // key down
    if (e.keyCode == 40)
    {
        e.preventDefault();
        // some work...
    }
    // key up
    else if (e.keyCode == 38)
    {
        e.preventDefault();
        // some work...
    }
}

Как это сделать в Blazor? С @onkeydown:preventDefault вы можете запретить весь ввод . Если я установлю его в переменную (@PreventDefault), я могу запретить только следующий вход (поскольку первый вход уже произошел). Просто для понимания того, что я имею в виду:

  • PreventDefault FALSE> Ввод «H»> установите PreventDefault в FALSE
  • PreventDefault FALSE> Ввод «ArrowUp»> установите PreventDefault в TRUE
  • PreventDefault TRUE > Вход «i»> установите для PreventDefault значение FALSE

Таким образом, вход будет (| = курсор): H | > | H> | H

Что означает, что курсор неправильный, а "i" было предотвращено.

Есть идеи? Спасибо за совет.

1 Ответ

2 голосов
/ 22 февраля 2020

К сожалению, на данный момент нет простого решения для этого. Для этого сценария вам все равно потребуется использовать обработчик событий JS и, возможно, некоторое взаимодействие, если вы захотите перезвонить в ваш код. NET.

Вы найдете очень короткий комментарий от Стива Сандерсона о причина (асинхронные c обработчики) здесь https://github.com/dotnet/aspnetcore/issues/14517#issuecomment -559184498

Другим обходным решением является привязка ввода к переменной и обновление значений вручную. (также указано здесь PreventDefault на входе Blazor ) Но это, вероятно, ухабистая дорога.

Лично я хотел бы видеть warnDefault и stopPropagation как часть EventArgs, которые передаются в C# обработчики методов. Я предполагаю, что это технически сложно. Тем не менее, это упростит много вариантов использования. Возможно, вы захотите открыть проблему для этого в aspnetcore.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...