【发布时间】:2021-05-02 19:39:07
【问题描述】:
我有这个(简化的)组件,用户输入一个值并按下回车键。这应该会导致输入消失,直到一个过程完成,然后输入应该再次显示。
@if (!commandRunning)
{
<div class="action">
<div class="command">
<span class="symbol">></span>
<input @ref="input" class="in" type="text" @bind-value="@_command" @bind-value:event="oninput" @onkeypress="@(e => KeyPressed(e))">
</div>
</div>
}
@code {
private string _command { get; set; }
private bool commandRunning;
private ElementReference input;
private async Task KeyPressed(KeyboardEventArgs args)
{
if (args.Key == "Enter")
{
commandRunning = true;
await Task.Delay(1000);
commandRunning = false;
await input.FocusAsync();
}
}
}
然而,这会导致以下错误:
blazor.webassembly.js:1 crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
Unhandled exception rendering component: Unable to focus an invalid element.
Error: Unable to focus an invalid element.
所以输入尚未在聚焦点创建。
通过在焦点调用之前添加 StateHasChanged() 来更改代码使其工作。
commandRunning = true;
await Task.Delay(1000);
commandRunning = false;
StateHasChanged();
await input.FocusAsync();
这是预期的行为吗?是否在执行该方法之后才在剃刀代码中评估更改的布尔值?
【问题讨论】:
-
不是“隐藏”文本框,而是让您的观众看到闪烁的文本框,可能会改变颜色;} 现在说真的,您真的要隐藏文本框吗?那么恢复呢?这真是太糟了。不要那样做。只需禁用文本框。
-
将您的输入放在另一个组件中。使用新的组件循环来管理其焦点。
-
我应该解释代码背后的原因。它用于模拟控制台终端。用户输入一些东西,按下回车键,输入被隐藏,命令被执行,当它完成后,用户现在可以再次输入。
标签: blazor