【发布时间】:2020-06-06 06:11:52
【问题描述】:
我试图从页面更改我的一个组件内的元素的类,但这些类永远不会改变。我在函数里面放了一个Console.Writeline,函数是definitley运行的。
CircleClass 变量默认设置为"danger",并且工作正常,div 以danger class 开头。 console.writeline 确认变量正在被更改,它只是没有更新元素。
组件中的代码:
<div class="circle @CircleClass"></div>
@code {
private string CircleClass = "danger";
public void ChangeStatus(int status)
{
switch (status)
{
case 0:
CircleClass = "idle";
break;
case 1:
CircleClass = "safety";
break;
case 2:
CircleClass = "danger";
break;
}
Console.WriteLine($"{status} Circle: {CircleClass}");
}
}
第一次尝试
@page "/"
@Inject Nav nav
<button @onclick="@(e => nav.ChangeStatus(2))">Two</button>
在Startup.cs 我添加了这个:
services.AddSingleton<Nav>();
第二次尝试
@page "/"
<button @onclick="@(e => ChangeStatus(2))">Two</button>
private void ChangeStatus(int status)
{
Nav nav = new Nav();
nav.ChangeStatus(status);
}
我认为这可能与创建类的新实例有关,该实例无法更改我需要更改的元素的类,尽管我认为使用AddSingleton 时应该解决这个问题。
有谁知道是什么导致了这个问题?
在组件内部调用函数确认该函数确实有效。
组件:
protected override void OnInitialized()
{
ChangeStatus(1);
}
我正在尝试什么:
Nav.razor
<li id="status">
<div class="circle @CircleClass"></div>
</li>
@code {
private string CircleClass = "danger";
public void ChangeStatus(int status)
{
switch (status)
{
case 0:
CircleClass = "idle";
break;
case 1:
CircleClass = "safety";
break;
case 2:
CircleClass = "danger";
break;
default:
CircleClass = "idle";
break;
}
Console.WriteLine($"{status} Circle: {CircleClass}");
InvokeAsync(() =>
{
StateHasChanged();
});
}
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSingleton<Nav>();
}
Index.razor
@page "/"
@inject Nav nav
<button @onclick="@(e => nav.ChangeStatus(0))">Zero</button>
<button @onclick="@(e => nav.ChangeStatus(1))">One</button>
<button @onclick="@(e => nav.ChangeStatus(2))">Two</button>
在我上面的代码示例中,我使用按钮尝试从页面运行导航组件中的功能,但最终我将在不同的地方运行这些功能,这些地方在没有用户直接输入的情况下不会是页面。
Nav 组件是在我的MainLayout 中定义/创建的,它不直接应用于Index 页面。
【问题讨论】:
标签: blazor