【问题标题】:Blazor [Parameter] not updating input variablesBlazor [参数] 不更新输入变量
【发布时间】:2021-05-26 01:40:41
【问题描述】:

我有一个自定义组件InlineAutocomplete。无论我做什么,我的pic 值和SelectedPIC 值在我进行验证时始终为空,并且不确定为什么会这样。 组件确实呈现正确,但无法以正确设置的值取回我的参数。

用法如下:

<InlineAutocomplete TItem="PIC"
                    Value="@pic"
                    Selected="@SelectedPIC"
                    Data="@PICs"
                    Property="@((item) => item.PICNumber)" />
                
                

我的组件:

<div class="inline-autocomplete">
    <input @oninput="(e)=> SuggestItem(e)" type="text" @bind-value="@Value" class="overlap inline-autocomplete-input " />
    <input readonly class="overlap inline-autocomplete-label" value="@_suggestedValue" />
</div>

@code {

    string _value;
    string _suggestedValue;

    [Parameter]
    public string Value
    {
        get => _value;
        set
        {
            if (value == null)
                return;

            _value = value;
        }
    }

    [Parameter]
    public List<TItem> Data { get; set; }

    [Parameter]
    public Func<TItem, string> Property { get; set; }

    [Parameter]
    public TItem Selected { get; set; }

    void SuggestItem(ChangeEventArgs e)
    {

        if (string.IsNullOrEmpty(e.Value.ToString()))
            return;

        Value = e.Value.ToString().ToUpper();

        if (string.IsNullOrEmpty(Value))
        {
            _suggestedValue = string.Empty;
        }
        else
        {
            var selectedItem = Data.Select(Property).FirstOrDefault(x => x.StartsWith(Value, StringComparison.OrdinalIgnoreCase));
            _suggestedValue = !string.IsNullOrWhiteSpace(selectedItem) ? selectedItem : string.Empty;
            Selected = Data.FirstOrDefault(x => string.Equals(Property(x), Value, StringComparison.OrdinalIgnoreCase));
            StateHasChanged();
        }

        // State has changed
        StateHasChanged();
    }
}

【问题讨论】:

  • 似乎是一个通用类型的组件,但没有@typeparam TItem 指令。这看起来不像是一个完整的组件代码示例。我看不到 _value 或声明的其他本地值
  • 你能不能像我一样用其他重命名 Value 属性,尽管这个词非常常用,而且在所有语言中这是保留词,所以它可能会在你给定的地方引用。跨度>
  • @Quango,为了节省空间,这是一个不完整的例子。 _value 只是一个常规字段 string _value; @Ajay2707 使用大写来命名 Blazor 属性是正常的,因为它们要模仿的属性。例如Value =&gt; valueClass =&gt; class等...

标签: c# blazor blazor-webassembly


【解决方案1】:

解决这个问题的方法是传递一个函数来更改父级而不是子级中的属性。

孩子:

 [Parameter]
public Action<string, TItem> ValueChanged { get; set; }

...

@code {
     void SomeFunction() {
          ValueChanged(Value, Selected);
     }
}

家长:

<InlineAutocomplete ... ValueChanged="FireEvent" />

void FireEvent(string stringVal, MyClass c)
{
    // ... Do Something
}

【讨论】:

    猜你喜欢
    • 2018-11-23
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多