Не удается получить входное значение, установленное Javascript, а затем прочитать нажатием кнопки Blazor

Внутри приложения .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 и не работал.

вам нужно вызвать метод .Net обратно в Blazor, чтобы установить Received

agua from mars 23.12.2020 16:24

@aguafrommars Я проверил blazor-university.com/javascript-interop/… и это показалось немного ненужным дополнительным усилием для получения такой ценности. Должен быть более простой способ.

Demir 23.12.2020 16:41

Насколько я знаю, нет. Прочтите официальный документ: learn.microsoft.com/en-us/aspnet/core/blazor/…

agua from mars 23.12.2020 16:43

Одним из способов может быть изменение поведения 'startBarcodeReader' для фактического возврата штрих-кода и изменение функции JSIInterop на такую, которая принимает возвращаемое значение. Другим вариантом может быть попытка прочитать штрих-код из некоторой переменной js, когда вы действительно этого хотите. Я лично добавил глобальный вспомогательный скрипт, который я могу вызывать с помощью JSinterop из любого места для доступа к свойствам js.

Michel Jansson 23.12.2020 18:57

Да, я потерян. Я передал файл на аутсорсинг. Спасибо

Raffael Gangelberger 23.12.2020 19:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
404
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как правило, ваш JS-код никоим образом не должен мешать функциям рендеринга и ограничения Blazor. Таким образом, вы не можете присвоить значение полю ввода в JavaScript и ожидать, что это значение будет передано в ограничивающую переменную Received. Это никогда не может произойти. Как Blazor может знать, что значение поля ввода изменилось! Есть ли какой-либо прослушиватель событий, прикрепленный к полю ввода, который должен уведомить Blazor о том, что значение было введено? Никто.

Решение: Передайте значение методу Blazor, в котором вы можете обновить переменную Received... После этого компонент будет перерендерен, и в поле ввода будет отображаться то же значение внутри него, но на этот раз это делается рендерингом. и ограничивающие функции Blazor.

Примечание. Вы можете использовать DotNetObjectReference для вызова вашего JavaScript, передав ему ссылку на объект C#, который определяет метод для получения значения штрих-кода при вызове из JavaScript.

Предложение возвращаемого значения @Michel Jansson не сработало, потому что считыватель штрих-кода работает непрерывно, значение приходит в неопределенное время, когда штрих-код обнаруживается и считывается. Большое спасибо за информацию. Решает проблему. Кроме того, идея глобальной вспомогательной функции от Мишеля Янссона для доступа к свойствам js также работает.

Demir 24.12.2020 00:56

Другие вопросы по теме