我正在尝试从页面更改我的组件之一内的元素的类,但是类从未改变。我在函数中放入了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);
}
我正在尝试:
<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();
});
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSingleton<Nav>();
}
@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组件中的功能,但最终,我将从不同的地方运行这些功能,而这些地方将不会在没有直接用户输入的情况下成为页面。
Nav
组件是在我的MainLayout
中定义/创建的,它没有直接应用于Index
页面。
答案 0 :(得分:1)
您可以执行以下操作。我认为您不需要导航服务。您可以从页面本身调用和更改类的值。
内部索引页面
HTML
<Nav @ref="navComp"></Nav>
<button @onclick="@(e => navComp.ChangeStatus(0))">Zero</button>
<button @onclick="@(e => navComp.ChangeStatus(1))">One</button>
<button @onclick="@(e => navComp.ChangeStatus(2))">Two</button>
C#代码
@code {
Nav navComp;
//other code
}
内部导航组件
HTML
<h3>Nav</h3>
<li id="status">
<div class="circle @CircleClass"></div>
</li>
C#代码
@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();
});
}
}
您可以在此处看到输出。
答案 1 :(得分:1)
您需要提供可以帮助管理组件的服务。
首先:
members: "mongodb1:27017,mongodb2:27017,mongodb3:27017"
)。ChangeStatus()
函数结束时触发它。ChangeStatus()
其次:
using System;
namespace MyAppName.Services
{
public delegate void MyEventHandler();
public class MyService
{
public event MyEventHandler MyEvent;
public 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;
}
// Fire event
MyEvent?.Invoke();
}
}
}
。Singleton
文件中。_Imports.razor
// In Blazor Server-Side
// open Startup.cs and add:
public void ConfigureServices(IServiceCollection services)
{
// [..]
services.AddSingleton<MyService>();
}
// In Blazor WebAssembly
// open Program.cs and add:
public static async Task Main(string[] args)
{
// [..]
builder.Services.AddSingleton<MyService>();
}
第三次:
// This will only work if the namespace
// for your service is the MyAppName.Services.
// If you put your service in the Services folder
// you should be fine unless you renamed the namespace.
@using MyAppName.Services
。StateHasChanges()
最后:
// At the top:
@inject MyService myService
// Subscribe to event and create function
@code {
protected override void OnInitialized()
{
myService.MyEvent+= UpdateState;
}
private void UpdateState()
{
// Need to use InvokeAsync, atleast
// on Blazor Server-Side
InvokeAsync(() =>
{
StateHasChanged();
});
}
}
功能ChangeStatus()