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