[英]Blazor Server side shared component is not showing updated data without page reload
我正在制作一個 blazor 服務器端項目,並包含項目所有頁面的共享布局,其中包括一個組件內的熱門搜索文本框,如下所示
<div>
<TopSearchInput></TopSearchInput> // This component will appear on the header across all the pages
</div>
<div>
@Body //Different pages will render here...
</div>
應用程序啟動如下
services.AddTransient<IContactService, ContactService>();
有一個名為 Contact Details 的頁面,該頁面的設計類似於
ContactDetailsPage 組件----]--
@inject IContactService ContactService
<div >@ContactMaster.Status</div>
<button click="updateStatus()" />
@code
{
[Parameter]
public ContactViewModel ContactMaster { get; set; }
async void updateStatus()
{
bool updated = await ContactService.IgnoreContact(ContactMaster.Id);
if (updated)
{
ContactMaster.Status = "Ignored";
}
}
}
此頁面用於加載聯系信息,在此頁面內,我正在執行狀態更新,並且 model 正在被修改,頁面正在以修改狀態刷新而不重新加載頁面
我的熱門搜索框正在執行搜索並顯示搜索結果,組件如下所示
TopSearchInput 組件----]----]
@inject IContactService ContactService
<input Class="pa-2 ma-0 globalsearchbox" disabled="@IsOpen" @bind-value="SearchText"
@bind-value:event="oninput" @onkeyup="OnInputKeyDown" />
<div>Search results will come here as list of contact.name contact.status .....from
resultmodel returned by the service</div>
@code
{
public string SearchText { get; set; } = string.Empty;
private async Task OnInputKeyDown(KeyboardEventArgs e)
{
if (e.Code == "Enter" || e.Code == "NumpadEnter")
{
if (string.IsNullOrWhiteSpace(SearchText) || SearchText.Length < 3)
{
SearchText = "";
return;
}
else
{
resultModel = await ContactService.GetGlobalSearchResults(SearchText);
}
}
}
}
在我重新加載頁面之前,狀態不會被修改 例如:如果我執行搜索“亞當”,結果將顯示為
Adam1 活躍
亞當2活躍
Adam3 活躍
當我單擊 Adam1 時,它會加載 Adam1 的 ContactDetailsPage 並在頁面內將 Adam1 的狀態更新為已忽略。 該服務更新了數據庫中的記錄,我從服務中得到了正常的響應,並且該組件正在重新渲染,並正確地修改了狀態。 直到那時我才執行任何頁面重新加載
在頂部搜索框,如果我再次搜索關鍵字,我會得到相同的結果集
Adam1 Active [哪個是錯誤的,正確的狀態是 Ignored ]
亞當2活躍
Adam3 活躍
但是,如果我重新加載頁面並進行搜索,那么搜索結果的正確狀態將會到來
有沒有辦法確保 ContactService.GetGlobalSearchResults 返回具有最新記錄狀態值的結果? 是因為我在啟動時注冊服務的方式嗎? 還是其他什么原因?
好吧,既然您將ContactService
注冊為瞬態,那么理論上每個組件都會獲得該服務的單獨副本。 在這些組件的生命周期的后期,他們將在重新渲染時收到相同的服務副本——當涉及到 Blazor 服務器端和范圍時,這很有趣。
所以我想說嘗試將此服務設為范圍服務,看看這會給您帶來什么 - 請注意,范圍將類似於 Blazor 服務器中每個用戶的 singleton - 您需要深入了解一些關於它的帖子,這是一個相當廣泛的主題。
此 scope 更改應該為您提供服務內的共享數據。 另一件事是通知搜索組件它需要重新渲染 - 無論是通過參數還是來自服務的某種事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.