【发布时间】:2021-07-20 10:40:41
【问题描述】:
我想为第三方组件的参数设置默认值。说我有这个:
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 子代的“父组件”,如果可能的话)。
【问题讨论】:
-
我认为
Data="@MyData"不会在MyData更改时重新呈现页面。您是否会更改其值作为对某些事件的响应? -
@PharazFadaei 它不会自动发生,但如果您执行
StateHasChanged或者它是EventCallback,它会自动执行。如果我以编程方式设置它(不在 razor 组件模板上),它也不会。 -
@PharazFadaei 也就是说,如果我这样做
<MyDerivedComponent Data="@this.Data">,它会按预期工作......如果我通过代码设置它(<MyDerivedComponent PageComponent="@this">,然后是this.Data = PageComponent.Data;),它不会跨度> -
你的意思是如果你只做
Data="@this.Data"然后改变this.Data的值组件会自动重新渲染? -
假设您在
MyBasePage上调用StateHasChanged时Data的值发生变化,MyBasePage组件将相应地重新呈现。MyDerivedComponent是MyBasePage的子代,具有复杂类型参数 (PageComponent),因此其OnParametersSet将基于 the docs 调用。
标签: c# blazor blazor-server-side