簡體   English   中英

以編程方式進行單向 [Parameter] 綁定

[英]One-way [Parameter] binding programatically

我想為第三方組件上的參數設置默認值。 說我有這個:

myBasePage.cs:

public class MyBasePage : ComponentBase
{
  public IEnumerable MyData { get; set; }
}

myPage.razor:

@inherits MyBasePage
<ThirdPartyComponent Data="@MyData" />

由於ThirdPartyComponent上的Data是具有DataHasChanged()虛方法的[Parameter] ,因此通過像這樣呈現blazor 組件,我將獲得單向綁定,如果我以編程方式更改頁面上的MyData ,該組件將更新。 這將正常工作。

現在,假設我不能修改ThirdPartyComponent ,但我想根據我的基本頁面在其中設置一些默認值......像這樣:

myPage.razor:

@inherits MyBasePage
<MyDerivedComponent PageComponent="@this" />

myDerivedComponent.cs:

public class MyDerivedComponent : ThirdPartyComponent 
{
   [Parameter] public MyBasePage PageComponent { get; set; }
   public override void OnInitialized()
   {
      /* Set other parameter defaults */
      this.OtherParameter = 10;

      /* Bind to Data, as if I was passing it as a parameter in the Razor template */
      this.Data = PageComponent.MyData;
   }
}

這一行:

this.Data = PageComponent.MyData;

根本不創建綁定(如果我修改MyData ,則 blazor 組件不會更新)。 有沒有辦法以編程方式創建它?

注意:真正的ThirdPartyComponent不僅包括大量參數,還包括模板等。出於多種原因,我希望MyDerivedComponent是派生類型,而不是具有ThirdPartyComponent子項的“父組件”,如果可能的話全部)。

這應該有效:

public class MyDerivedComponent : ThirdPartyComponent 
{
   [Parameter] public MyBasePage PageComponent { get; set; }
   public override void OnInitialized()
   {
      /* Set other parameter defaults */
      this.OtherParameter = 10;


      //this.Data = PageComponent.MyData;
   }
}

 protected override void OnParametersSet()   
 {
    Data = Data ?? PageComponent?.MyData ;  // determine priority
    base.OnParametersSet();
 }

OnParametersSet()通知組件它有新的參數。 最派生的類可以在這里進行干預。

但是當this.MyData發生變化時,沒有簡單的解決方案,這對 Blazor this.MyData是看不見的。

有沒有辦法以編程方式創建它? 當然,但這並不意味着你應該這樣做。

不應在組件代碼中設置或操作參數 每當Renderer調用SetParametersAsync時,都會在外部設置參數。 如果您在內部更改它們,則會創建兩個版本的真相。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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