Blazor - <select>не запускает изменения модели контекста edtform - PullRequest
1 голос
/ 01 апреля 2020

У меня есть страница заказа в моем приложении Blazor, которая принимает детали заказа, с таблицей, в которую добавляются строки заказа. У меня есть функция «CalculateTotals ()», которую необходимо вызывать каждый раз при изменении поля, например количества или цены за единицу, для обновления итогов в пользовательском интерфейсе, прежде чем пользователь отправит форму заказа.

Кажется, что все функции работают отлично для любых элементов управления, кроме <select>. В каждой строке заказа также есть набор «налогов». Это представлено циклом по налоговым строкам для каждой строки заказа и отображением раскрывающегося списка, в котором пользователь выбирает налоговый код. Когда выбор сделан, кажется, что @onchange сработал, поскольку я вижу изменение значения в выводе json модели, но функция CalculateTotals никогда не вызывается, поэтому событие onfieldchanged в моем коде не выполняется. срабатывает. Кажется, что он делает это для любого <select>, который я использую, независимо от того, где он находится в форме редактирования. Я использую вместо <InputSelect>, поскольку мои значения выпадающего списка - Guids. У кого-нибудь есть идея, почему событие onFieldChange не будет вызвано изменением поля модели? Ниже приведен фрагмент моего кода.

<EditForm EditContext="@formContext">    
    <DataAnnotationsValidator />
    <ValidationSummary />
    <div class="row">
        <div class="col-12">
            <div class="card">
                    <div class="row">
                        <div class="col-12">
                            <div class="table-responsive">
                                <table class="table mt-4" ondragover="event.preventDefault();">
                                    <thead>
                                        <tr>
                                            <th>#</th>
                                            <th>Description</th>
                                            <th>Quantity</th>
                                            <th>Unit Cost</th>
                                            <th>Taxes</th>
                                            <th class="text-right">Total</th>
                                        </tr>
                                    </thead>
                                    <tbody>

                                        @if (order.OrderLines != null)
                                        {
                                            foreach (var line in order.OrderLines.OrderBy(x => x.LineNumber))
                                            {
                                            <tr >

                                                <div id="dragdiv" class="dragula-handle" draggable="true" @ondrop="@(()=> Drop(line))" @ondrag="@(()=> StartDrag(line))" @key="line.Id"></div>

                                                    <td>
                                                        <InputText id="item-desc" @bind-Value="line.Description" class="form-control form-control-sm" disabled="@FormDisabled" placeholder="Description" />
                                                    </td>

                                                    <td>
                                                        <InputNumber id="item-qty" @bind-Value="line.Quantity" class="form-control form-control-sm" disabled="@FormDisabled" placeholder="Qty" />
                                                    </td>

                                                    <td>
                                                        <InputNumber id="item-unit-cost" @bind-Value="@line.AmountPerUnit" class="form-control form-control-sm" disabled="@FormDisabled" placeholder="Unit Cost" />
                                                        <ValidationMessage For="@(() => line.AmountPerUnit)" />
                                                    </td>

                                                    <td>
                                                        @if (line.Taxes != null)
                                                        {
                                                            foreach (var tax in line.Taxes)
                                                            { 
                                                            <select id="tax-@tax.TaxCodeId" @bind="tax.TaxCodeId" class="form-control">
                                                                @if (taxCodes != null)
                                                                {
                                                                    foreach (var taxcode in taxCodes)
                                                                    {
                                                                        <option value="@taxcode.Id">@taxcode.Name</option>
                                                                    }
                                                                }
                                                            </select>
                                                            }
                                                        }
                                                    </td>
                                            </tr>
                                            }
                                        }
                                    </tbody>
                                </table>
                            </div> <!-- end table-responsive-->
                        </div> <!-- end col -->
                    </div>
                    <!-- end row -->
                </div> <!-- end card-body-->
            </div> <!-- end card -->
        </div> <!-- end col-->
    </div>
</EditForm>

@code {

    protected override async Task OnInitializedAsync()
    {
        await Load();

        formContext = new EditContext(order);
        formContext.OnFieldChanged += EditContext_OnFieldChanged;

        await base.OnInitializedAsync();
    }

    private void EditContext_OnFieldChanged(object sender,FieldChangedEventArgs e)
    {
        Console.WriteLine(e.FieldIdentifier.FieldName);

        if (formContext.Validate())
        {
            // You can validate the EditContext here, and do necessary 
            CalculateTotals();
        }
    }

}

1 Ответ

4 голосов
/ 01 апреля 2020

Каждый Input* получает EditForm * EditContext в каскадном параметре. Когда значение изменяется, они вызывают EditContext.NotifyFieldChanged, которые запускают проверку поля.

Если вы не используете InputSelect, проверка поля не выполняется. Но вы можете сделать свой собственный select компонент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...