我有一個 AppState 服務,它具有以下內容:
public event Action OnDataChanged;
public MyObject CurrentObject { get; private set; }
public void UpdateMyObject(MyObject obj)
{
CurrentObject = obj;
OnDataChanged?.Invoke();
}
在一個組件中,我呼叫UpdateMyObject. 該AppState服務確實受到正確資料的影響,并被OnDataChanged?.Invoke()呼叫。
在另一個應該訂閱以OnDataChanged對資料更新做出決定的組件中,我有以下內容:
protected override void OnInitialized()
{
AppStateService.OnDataChanged = UpdateData;
}
private void UpdateData()
{
var data = AppStateService.CurrentObject;
}
我試圖在“監聽”組件上放置斷點,但沒有任何結果。關于我做錯了什么以及為什么不從狀態服務UpdateData呼叫方法的任何想法?OnChanged?.Invoke關于如何除錯的建議?
uj5u.com熱心網友回復:
這是我的有效代碼 - 我在 Blazor Server 模板解決方案中構建了它。為簡單起見,我已將您的物件設為字串。
public class AppState
{
public Guid Id { get; } = Guid.NewGuid();
public event Action? OnDataChanged;
// This is more normal for events
public event EventHandler? DataChanged;
public string? CurrentObject { get; private set; }
public void UpdateMyObject(string obj)
{
CurrentObject = obj;
OnDataChanged?.Invoke();
DataChanged?.Invoke(this, new EventArgs());
}
}
服務注冊
builder.Services.AddSingleton<WeatherForecastService>();
// Set as a singleton as the name suggests it's application specific and not user specific
builder.Services.AddSingleton<AppState>();
顯示狀態的組件
// AppStateComponent.razor
@inject AppState AppStateService
@implements IDisposable
<h3>AppStateComponent</h3>
<div class="m-2 p-2">
Service ID: @this.AppStateService.Id.ToString()
</div>
<div>
Data: @this.data
</div>
@code {
private string data = string.Empty;
protected override void OnInitialized()
{
this.AppStateService.OnDataChanged = UpdateData;
}
private void UpdateData()
{
data = this.AppStateService.CurrentObject!;
this.InvokeAsync(StateHasChanged);
}
public void Dispose()
{
this.AppStateService.OnDataChanged -= UpdateData;
}
}
和一個測驗頁
@page "/"
@inject AppState AppStateService
<div class="m-2 p-2">
Service ID: @this.AppStateService.Id.ToString()
</div>
<AppStateComponent />
<div class="m-2">
<button class="btn btn-dark" @onclick=UpdateData>Update</button>
</div>
@code {
private void UpdateData()
{
this.AppStateService.UpdateMyObject($"Updated at {DateTime.Now.ToLongTimeString()}");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/455884.html
上一篇:Web瀏覽器不再支持C#
