簡體   English   中英

Blazor 服務器端共享組件在沒有頁面重新加載的情況下不顯示更新的數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM