[英]Blazor Server-Side variable doesn't update after function call because of OnAfterRenderAsync
[英]Blazor CascadingParameter won't update layout when I call it from a function, after an onclick event
我正在尝试使用布局中的 CascadingParameter 以通用方式管理我网站的“加载”。
但是,在调用“onclick”加载之后,我无法从“继承页面”EditForm 的“OnValidSubmit”函数中停止“加载”。
让我给你看。
在我的 MainLayout 中,我设法显示正在加载的 h2 或页面的内容,无论它是什么:
<CascadingValue Value="this">
@if (load == true)
{
<h2>Loading...</h2>
} else
{
@Body
}
</CascadingValue>
@code
{
public bool load = false;
//---------------------------
// Setters
public void Loading()
{
load = true;
}
public void StopLoading()
{
load = false;
}
}
在从该 MainLayout 继承的其他页面中,我有一个 EditForm 将检查用户名和密码是否与数据库匹配。
如果没有错误,则应调用“加载”函数,然后在数据库中进行搜索,然后导航到主页。
因此,我将“加载”功能添加到我的 EditForm 的“onclick”中,当我单击按钮时,它会正确显示加载 h2:
<EditForm Model="@user" OnValidSubmit="@TriggerLogin">
<InputText id="name" placeholder="Email" @bind-Value="user.Username" inputmode="email" />
<InputText id="password" placeholder="Mot de passe" @bind-Value="user.Password" type="password" inputmode="text" />
<button class="button-pink" type="submit" @onclick="Layout.Loading">Se connecter</button>
</EditForm>
然后使用我的“OnValidSubmit”函数在数据库中进行研究:
private async Task TriggerLogin()
{
if (members.Login(user) == true)
{
// Do stuff with accesstoken
Layout.StopLoading();
NavigationManager.NavigateTo("/commandes");
}
else
{
Layout.StopLoading();
error = "Wrong password or username";
}
}
但是我的 StopLoading() 函数没有更新我的页面!
即使我的调试器说我在布局中正确输入了函数,布局也不会输入 html 部分的“else”,也不会显示“@Body”。
我试图在布局中使用 this.StateHasChanged() (它唯一工作的地方)但我正在寻找另一个解决方案,因为它不会显示错误消息。
我该怎么做才能强制布局刷新 html 部分? 谢谢
通常失败的重载可以通过使用StateHasChanged();
来解决StateHasChanged();
所以试试
public void StopLoading()
{
load = false;
InvokeAsync(StateHasChanged);
}
- - 编辑 - -
如果这使局部变量丢失,则可以选择将这些变量移动到服务中。 在我的示例中,我仅针对加载和错误执行此操作,但可以像加载一样完成其余操作。
public class LoadService {
public bool Load {get;set;}
public String ErrorMessage {get;set;}
}
然后改变你的代码:
@inject LoadService LoadService
//... html part
@if (LoadService.Load== true)
{
<h2>Loading...</h2>
}
//... html part
@code
{
//... html part
public void StopLoading()
{
LoadService.Load = false;
InvokeAsync(StateHasChanged);
}
}
设置错误信息:
private async Task TriggerLogin()
{
if (members.Login(user) == true)
{
// Do stuff with accesstoken
Layout.StopLoading();
NavigationManager.NavigateTo("/commandes");
}
else
{
Layout.StopLoading();
LoadService.ErrorMessage = "Wrong password or username";
}
}
不要忘记在 Program.cs 中注册服务
builder.Services.AddSingleton<LoadService>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.