Внутри приложения .NET 5 blazor я использую библиотеку javascript для чтения штрих-кода. Когда я нажимаю кнопку на странице blazor, я вызываю функцию javascript. Функция Javascript считывает штрих-код и устанавливает значение поля ввода.
Существует поле ввода, привязанное к строковому значению:
<input id = "result" @bind = "@Received"/>
@code { private string Received { get; set; } }
Нажатие кнопки вызывает функцию javascript:
public async Task Start()
{
await JSRuntime.InvokeVoidAsync("startBarcodeReader");
}
Функция Javascript устанавливает значение поля ввода:
document.getElementById('result').value = "Barcode Value";
Все работает, как я и ожидал, и я вижу значение штрих-кода на своем экране. Я хотел бы использовать Received
, когда я нажимаю другую кнопку. Однако связанное значение равно null. Это не установлено.
public async Task Add()
{
// Received is null
await Task.CompletedTask;
}
Если я вручную ввожу что-то в поле ввода, то устанавливается значение переменной Received. Кажется, что привязка не устанавливается связанной переменной, если фокус не потерян.
Как я могу получить значение, которое я вижу в поле ввода? Я пытался использовать событие oninout поля inout и не работал.
@aguafrommars Я проверил blazor-university.com/javascript-interop/… и это показалось немного ненужным дополнительным усилием для получения такой ценности. Должен быть более простой способ.
Насколько я знаю, нет. Прочтите официальный документ: learn.microsoft.com/en-us/aspnet/core/blazor/…
Одним из способов может быть изменение поведения 'startBarcodeReader' для фактического возврата штрих-кода и изменение функции JSIInterop на такую, которая принимает возвращаемое значение. Другим вариантом может быть попытка прочитать штрих-код из некоторой переменной js, когда вы действительно этого хотите. Я лично добавил глобальный вспомогательный скрипт, который я могу вызывать с помощью JSinterop из любого места для доступа к свойствам js.
Да, я потерян. Я передал файл на аутсорсинг. Спасибо
Как правило, ваш JS-код никоим образом не должен мешать функциям рендеринга и ограничения Blazor. Таким образом, вы не можете присвоить значение полю ввода в JavaScript и ожидать, что это значение будет передано в ограничивающую переменную Received
. Это никогда не может произойти. Как Blazor может знать, что значение поля ввода изменилось! Есть ли какой-либо прослушиватель событий, прикрепленный к полю ввода, который должен уведомить Blazor о том, что значение было введено? Никто.
Решение: Передайте значение методу Blazor, в котором вы можете обновить переменную Received
... После этого компонент будет перерендерен, и в поле ввода будет отображаться то же значение внутри него, но на этот раз это делается рендерингом. и ограничивающие функции Blazor.
Примечание. Вы можете использовать DotNetObjectReference
для вызова вашего JavaScript, передав ему ссылку на объект C#, который определяет метод для получения значения штрих-кода при вызове из JavaScript.
Предложение возвращаемого значения @Michel Jansson не сработало, потому что считыватель штрих-кода работает непрерывно, значение приходит в неопределенное время, когда штрих-код обнаруживается и считывается. Большое спасибо за информацию. Решает проблему. Кроме того, идея глобальной вспомогательной функции от Мишеля Янссона для доступа к свойствам js также работает.
вам нужно вызвать метод .Net обратно в Blazor, чтобы установить Received