【问题标题】:How to bind both ways to a select in a Child Component - Blazor如何将两种方式绑定到子组件中的选择 - Blazor
【发布时间】:2021-04-06 11:30:55
【问题描述】:

我试图将两种方式绑定到子组件中的选择元素。 Parent 应该能够更改 Child Select 的选定值,并且 Child Select 在更改时应该回调到 parent,以便它可以对新值做出反应。但是我似乎只能将事件传递给孩子,而不会将事件触发给父母。

我的父组件包含一个包含选择的子组件。父组件如下所示:

        <SelectInput @bind-Value="Selected">
            @ChildContent
        </SelectInput>

@code{

    [Parameter]
    public string Selected { get; set; }
    [Parameter] 
    public RenderFragment ChildContent { get; set; }
    [Parameter] 
    public EventCallback<string> SelectedChanged { get; set; }

    private async Task ValueChanged(string val)
    {
        await SelectedChanged.InvokeAsync(val);
    }
}

ValueChanged 和 SelectedChanged 都没有被调用。这是我想解决的问题。

子组件是 SelectInput 组件:

        <select value="@Value"
            @onchange="OnValueChanged">
            @ChildContent
        </select>
        
        @code{
            [Parameter]
            public string Value { get; set; }
            [Parameter] 
            public RenderFragment ChildContent { get; set; }
        
            public async Task OnValueChanged(ChangeEventArgs e)
            {
                Value = e.Value.ToString();
                await ValueChanged.InvokeAsync(Value);
            }
        }

此子元素正在工作并正在调用 ValueChanged 回调。但是我无法在父级中捕获回调,因为它已经被编译代码调用,因为绑定值(我需要它,因为它也可以在这个父控件之外更改。再次向下绑定正在工作,但是我也需要绑定在这种情况下向上 - 或者至少捕获事件并将其向上传播。 任何帮助将不胜感激:)

【问题讨论】:

    标签: blazor


    【解决方案1】:

    注意:不应改变参数属性。它们仅用于在组件之间流动数据。为简单起见,我忽略了这一点。

    祖父母

    @page "/"
    
    Type a value USA ,France,etc.:
    <input type="text" @bind="Selected" @bind:event="oninput" />
    
    <ParentComponent @bind-Value="Selected"></ParentComponent>
    
    @code{
         private string Selected { get; set; } = "Germany";
    }
    

    ParentComponent.razor

    <SelectInput @bind-Value="Value"></SelectInput>
    
    @code{
        private string _value;
    
        [Parameter]
        public string Value
        {
            get => _value;
            set
            {
                if(_value != value)
                {
                    _value = value;
                    _ = ValueChanged.InvokeAsync(_value);
                }
            }
        }
    
        [Parameter]
        public EventCallback<string> ValueChanged { get; set; }
    
    }
    

    SelectInput.razor

    <select value="@Value" @onchange="OnValueChanged">
        <option value="USA">USA</option>
        <option value="France">France</option>
        <option value="China">China</option>
        <option value="Germany">Germany</option>
        
    </select>
    
    @code{
        [Parameter]
        public string Value { get; set; }
    
        
    
        [Parameter]
        public EventCallback<string> ValueChanged { get; set; }
    
    
        public async Task OnValueChanged(ChangeEventArgs e)
        {
            Value = e.Value.ToString();
            await ValueChanged.InvokeAsync(Value);
        }
    }
    

    【讨论】:

    • 非常感谢@enet!工作一种享受。出于兴趣 - 这是分页控件的一部分,其中页码可以通过按钮集或选择输入(两个单独的组件)来更改,这就是我需要改变属性的原因。我们如何通过简单地向上游传播事件来做到这一点?
    • 不,你不应该改变参数属性。注意:您可以定义本地字段来保存从父组件传递的参数值,然后根据需要更改这些值。但不要更改参数属性本身的值。 “我们如何通过简单地向上游传播事件来做到这一点。”这就是我的代码显示的内容... 注意:当您有父子关系时,您可以使用带有事件回调的组件参数。
    • 但是当关系更深时(祖父母->父母->孩子->孙子女),最好的解决方案是使用服务。我在 SO 演示中有几个答案......寻找他们
    猜你喜欢
    • 1970-01-01
    • 2020-04-11
    • 2016-06-08
    • 2021-02-01
    • 1970-01-01
    • 2021-09-04
    • 2021-03-18
    • 2020-08-11
    • 2020-07-12
    相关资源
    最近更新 更多