提问人:enderaric 提问时间:4/26/2023 更新时间:4/27/2023 访问量:205
Blazor StateHasChanged 在自定义事件处理程序中不起作用
Blazor StateHasChanged not working in custom eventhandler
问:
我有一个事件处理程序,它将模型触发到 blazor 中的另一个组件。
public class NotifyStateService
{
public event EventHandler<CascadingItemEventArgs>? UpdateSubDropdownEvent;
public void NotifySubDropdown(object sender, CascadingItemEventArgs e)
{
if (this.UpdateSubDropdownEvent != null)
UpdateSubDropdownEvent(sender, e);
}
}
public class CascadingItemEventArgs : EventArgs
{
private CascadingDropdownModel _model;
public CascadingItemEventArgs(CascadingDropdownModel model)
{
_model = model;
}
public CascadingDropdownModel CascadingModel
{
get
{
return _model;
}
set
{
_model = value;
}
}
}
当我调用我的通知时,它可以正常工作,我可以从中获取值。然后我就可以做我的工作了。但它不会通过 StateHasChanged() 方法更改 UI。
private async void UpdateSubDropdown(object sender,CascadingItemEventArgs e)
{
if (BaseId.HasValue && HtmlName == e.CascadingModel.EffectiveId)
{
Regions = Task.Run(() => _apiClient.GetServiceResultAsync<UserRegionModel[]>($"UserRegion/GetByBaseId/{e.CascadingModel.Value}", Token)).GetAwaiter().GetResult();
await InvokeAsync(() => StateHasChanged());
}
}
在组件的前端,我需要显示新区域,但我不能。我做了很多测试,但需要找到合适的方法。
注意:区域填充正确。
答:
0赞
MrC aka Shaun Curtis
4/27/2023
#1
事件处理程序应如下所示:
private async void UpdateSubDropdown(object sender,CascadingItemEventArgs e)
{
if (BaseId.HasValue && HtmlName == e.CascadingModel.EffectiveId)
{
Regions = await _apiClient.GetServiceResultAsync<UserRegionModel[]>($"UserRegion/GetByBaseId/{e.CascadingModel.Value}", Token));
this.InvokeAsync(StateHasChanged);
}
}
除非您是异步专家,否则请保持简单。
如果这不起作用,您能向我们展示一个最小的可重复示例吗?你是怎么展示的?Regions
评论
0赞
ℍ ℍ
4/27/2023
这是一个改进,但并不重要,“区域正在正确填充”。await
0赞
ℍ ℍ
4/27/2023
而且 Task.Run() 没有受到伤害,这是针对 Blazor Server 的。
0赞
MrC aka Shaun Curtis
4/27/2023
在所有观点上都达成一致,但我们认为这是服务器的唯一原因是因为 OP 选择了标签。 看起来它正在进行 API 调用,所以我不太确定。并且可以杀死您的应用程序!我现在只是在钓鱼,因为 OP 并没有给我们太多可以继续前进的机会。blazor-server-side
GetServiceResultAsync<UserRegionModel[]>($"UserRegion/GetByBaseId/{e.CascadingModel.Value}"
.GetResult()
上一个:如何从库中调用标有装饰器的函数?
评论