当用户单击向上或向下箭头时,我需要将新数据加载到表单中。期望值是任何具有焦点的单元格,在加载新数据后仍保留焦点。
以下代码可以捕获键盘输入,并使用数据绑定将正确的记录加载到我的表单中。但是我发现,一旦绑定了新数据,表单就会失去焦点。
MyComponent.razor:
<span @onkeypress="@KeyHandler" @onkeydown="@KeyHandler">
<EditForm Model="@CurrentRecord">
<DataAnnotationsValidator />
<ValidationSummary />
@Content
</EditForm>
</span>
@code {
[Parameter]
public RenderFragment Content { get; set; }
public List<MyModel> Data { get; set; } = new List<MyModel>();
private int currentIndex;
protected async Task KeyHandler(KeyboardEventArgs e)
{
if (e.Key == "DownArrow") await LoadNextRecord();
}
async Task LoadNextRecord()
{
CurrentRecord = Data.ElementAt(++currentIndex);
// Form loses focus here!!
}
}
现在,我可以实现一个简单的JavaScript,以便在重新绑定数据时将焦点放在第一个元素上。但是我的要求是将焦点保持在原处。我找不到一种通用的方法来获取焦点元素,然后重新聚焦,而不必为表单中的每个元素分配一个ID或@ref。
还有另一种方法可以解决此问题吗?
答案 0 :(得分:1)
还有另一种方法可以解决此问题吗?
不,没有……没有通用的方法可以做到这一点,现在不行,而且可能不会在不久的将来。
当前,您最多可以在Blazor中设置输入的焦点,如下所示:
<button @onclick="() => textInput.FocusAsync()">Set focus</button>
<input @ref="textInput"/>
请注意,上面的代码段仅在Asp.Net Core 5.0(预览版)中有效。
我可以提出的唯一解决方案是设计一种方法来发现最后具有焦点的输入元素,然后从OnAfterRender / Async方法重新对其进行聚焦。您必须将@ref指令应用于每个输入元素或id属性。没有其他方法可以做到这一点。