以编程方式进行单向 [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()
通知组件它有新的参数。派生最多的class这里可以介入
但是当 this.MyData
发生变化时,没有简单的解决方案,这对 Blazor 来说是不可能的。
有没有办法以编程方式创建它?当然可以,但这并不意味着您应该这样做。
参数 不应在组件代码中设置或操作。每当 Renderer
调用 SetParametersAsync
时,都会在外部设置参数。如果您在内部更改它们,您会创建两个版本的真相。
我想为第三方组件的参数设置默认值。假设我有这个:
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()
通知组件它有新的参数。派生最多的class这里可以介入
但是当 this.MyData
发生变化时,没有简单的解决方案,这对 Blazor 来说是不可能的。
有没有办法以编程方式创建它?当然可以,但这并不意味着您应该这样做。
参数 不应在组件代码中设置或操作。每当 Renderer
调用 SetParametersAsync
时,都会在外部设置参数。如果您在内部更改它们,您会创建两个版本的真相。