Как сделать события клиентского интерфейса в Blazor
Я только начал играть с Blazor, и я уже вижу большой потенциал этой новой структуры.
мне интересно, как он справится с простыми вещами, такими как настройка фокуса на входном элементе управления? Например, после обработки события click я хочу установить фокус на элемент управления вводом текста. Должен ли я использовать JQuery для чего-то подобного, или у Blazor есть некоторые встроенные методы для такого рода вещь?
спасибо
обновление: вот как я делаю это сейчас, пока я не узнаю больше о Blazor. (Это работает, но я знаю, что будут лучшие способы справиться с такими вещами, когда Blazor будет готов к прайм-тайму.)
на мой взгляд у меня есть следующий раздел скрипт:
<script>
Blazor.registerFunction('FocusControl', (ctrl) => {
document.getElementById(ctrl).focus();
return true;
});
</script>
тогда в разделе функций у меня есть эта функция:
private void FocusControl(string ctrl)
{
RegisteredFunction.Invoke<bool>("FocusControl", ctrl);
}
затем я вызываю его из метода Refresh. (Это использование образца код TalkingDotNet в http://www.talkingdotnet.com/create-a-crud-app-using-blazor-and-asp-net-core/)
private async Task Refresh()
{
todos = await Http.GetJsonAsync<ToDoList[]>("/api/ToDo");
FocusControl("todoName");
StateHasChanged();
}
2 ответов
Blazor - это просто замена (точнее, "добавление значения") в javascript. Это решение только на стороне клиента (но может быть с некоторой легкой привязкой к ASP.Net в будущем).
по-прежнему полностью основан на html и CSS. C# заменяет часть js с помощью веб-сборки. Таким образом, ничего не изменилось в том, как вы получаете доступ / изменяете элементы управления html.
на данный момент (версия 0.1.0) вы должны полагаться на HTML DOM focus()
метод, чтобы сделать то, что вы намерены сделать (да, у вас есть использовать в JavaScript как сейчас :( ).
// Not tested code
// This is JavaScript.
// Put this inside the index.html. Just below <script type="blazor-boot"></script>
<script>
Blazor.registerFunction('Focus', (controlId) => {
return document.getElementById(controlId).focus();
});
</script>
//and then wrap it for calls from .NET:
// This is C#
public static object Focus(string controlId)
{
return RegisteredFunction.Invoke<object>("Focus", controlId);
//object type is used since Invoke does not have a overload for void methods. Don't know why.
//this will return undifined according to js specs
}
для более подробной информации вы можете обратиться ниже.
если вы хотите улучшить пеналы из JS аккуратно. ты можешь сделать что-то подобное. https://stackoverflow.com/a/49521216/476609
public class BlazorExtensionScripts : Microsoft.AspNetCore.Blazor.Components.BlazorComponent
{
protected override void BuildRenderTree(Microsoft.AspNetCore.Blazor.RenderTree.RenderTreeBuilder builder)
{
builder.OpenElement(0, "script");
builder.AddContent(1, "Blazor.registerFunction('Focus', (controlId) => { document.getElementById(controlId).focus(); });");
builder.CloseElement();
}
public static void Focus(string controlId)
{
RegisteredFunction.Invoke<object>("Focus", controlId);
}
}
затем добавьте этот компонент в корень. (Приложение.cshtml) на
<BlazorExtensionScripts></BlazorExtensionScripts>
<Router AppAssembly=typeof(Program).Assembly />
вы не можете напрямую вызвать функцию JavaScript. Вы должны сначала зарегистрировать свои функции, например,
<script>
Blazor.registerFunction('ShowControl', (item) => {
var txtInput = document.getElementById("txtValue");
txtInput.style.display = "";
txtInput.value = item;
txtInput.focus();
});
return true;
</script>
затем нужно объявить метод в C#, который вызывает эту функцию JavaScript. Как,
private void CallJavaScript()
{
RegisteredFunction.Invoke<bool>("ShowControl", itemName);
}
вы можете вызвать этот метод C# по щелчку кнопки. Как,
<button id="btnShow" class="btn btn-primary" @onclick(CallJavaScript)>Show</button>
этот пост создайте приложение CRUD с помощью Blazor и ASP.NET ядро показывает рабочую демонстрацию вызова JavaScript из Blazor.