Razor 页面组件 OnParametersSetAsync 在其父组件发生更改后不刷新

问题描述 投票:0回答:1

我有一个名为 _Upsert 页面的 razor 页面,它接受一个参数,并通过调用子组件并通过它传递值来将值传递给子组件。通常,一旦父组件对子组件值进行任何更改,它就应该通过调用其 OnParametersSetAsync 方法来更新子组件。但在此代码中,它没有调用 OnParametersSetAsync。我已经尝试了一切。请帮助我。

子页面 - TelerikTextAreaQuickCode.razor

@using MOM.Model.Setup
@using Telerik.FontIcons;
@using MOM.Model.Common;
@using BlazorBootstrap;
@using Telerik.Blazor.Components
@using System.Threading.Tasks
@using Microsoft.JSInterop

@inject MOM.Service.Setup.Interfaces.IQuickCodeService _quickCodeService;
@inject MOM.Service.Setup.Interfaces.IBranchService _branchService;

<TelerikTextArea Value="@TextValue" ResizeMode=TextAreaResizeMode.Auto Id="@Id" Size="@size" Rounded="@size" ValueChanged="@FillValueByCode" ValueExpression="@(() => TextValue)" />
  
@code {

    [Parameter]
    public List<byte> selectedBranchIds { get; set; } = new List<byte>();

    public EventCallback<List<byte>> selectedBranchIdsChanged { get; set; }

    private List<QuickCodeDTO>? quickCodeItems { get; set; } = new List<QuickCodeDTO>();
    private List<QuickCodeDTO>? quickCodeFiltered { get; set; } = new List<QuickCodeDTO>();
    public List<BranchDropListDTO>? BranchItems { get; set; }
    private string _value;


    protected override async Task OnInitializedAsync()
    {
        try
        {
            TextValue = Value;
            var branchTask = _branchService.GetUserBranches();
            var quickCodeTask = _quickCodeService.GetAllForDropDown();
            await Task.WhenAll(branchTask, quickCodeTask);
            var BranchResponse = await branchTask;
            var quickCodeResponse = await quickCodeTask;
            if (BranchResponse.Message == "SUCCESS")
            {
                BranchItems = BranchResponse.Data;
            }
            if (quickCodeResponse.Message == "SUCCESS")
            {
                quickCodeItems = quickCodeResponse.Data;
            }
            FilterCode();

        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    protected override async Task OnParametersSetAsync()
    {
        try
        {

            if (selectedBranchIds.Count() > 0)
            {
                quickCodeFiltered = quickCodeItems.FindAll(x => x.BranchAccessDTOs.Any(y => y.IsAccess && selectedBranchIds.Contains(y.BranchId)));
            }
            else
            {
                quickCodeFiltered = quickCodeItems.FindAll(x => x.BranchAccessDTOs.Any(y => BranchItems.Select(x => x.Id).Contains(y.BranchId)));
            }
        }
        catch(Exception ex)
        {
            throw ex;
        }
    }

    private void FillValueByCode(string newValue)
    {
        if (newValue.Contains("//"))
        {
            string[] newStrArr = newValue.Split('/');
            string[] codes = newStrArr[0].Split(' ');
            string quickCode = codes[codes.Length - 1];
            var result = quickCodeFiltered?.FirstOrDefault(x => x.Code.ToLower().Trim() == quickCode.ToLower().Trim());
            if (result != null)
            {

                TextValue = newValue.Replace($"{codes[codes.Length - 1].ToString()}//", result.Name);
            }
            else
            {
                TextValue = newValue;
            }
        }
        else
        {
            TextValue = newValue;
        }
    }
}

父页面 - _Upsert.razor

<FormGroup Columns="@subGroupLayoutColumnsCountupsert" ColumnSpacing="25px" Class="legende ">
<FormItem ColSpan="2">
    <Template>
        <label for="Name" class="k-label k-form-label">@MOM.Alias.Common.DTO.Remarks</label>
            <TelerikTextAreaQuickCode selectedBranchIds="@branchIds" @bind-Value="@dto.Remarks" Id="Remarks" />
        <TelerikValidationTooltip For="@(() => dto.Remarks)" TargetSelector="#Remarks" />
    </Template>
</FormItem>
@if (IsMultipleBranch == 1)
{
        <FormItem ColSpan="2">
        <Template>
                <BranchAccessNew @ref="@branchRef" ScreenName="@MOM.UI.Client.Constants.GRID.LeadType" ShowCount="true" BranchAccessDTOs="@dto?.BranchAccessDTOs" OnDialogueOpen="@((bool value) => { isChildDialogueOpen = value; })" onStateChange="@(()=> { dialogRef.Refresh(); })" onBranchChange="@GetbranchIds"></BranchAccessNew>
        </Template>
    </FormItem>
}
</FormGroup>

当我选择另一个分支但从branchAccessNew 中选择另一个分支时,方法 GetBranchIds 会命中,但它不会命中子页面组件。

请帮我解决这个问题。

c# .net blazor telerik
1个回答
0
投票

仅更改父级上用作子级参数的属性/字段的值不会触发子级的渲染。

在正常情况下,组件会因以下原因而发生突变:

  • UI 事件,或
  • 来自服务的正常事件。

对于前者,渲染内置于组件的 UI 处理代码中。

对于后者,您需要在事件处理程序中手动调用

StateHasChanged
。如果事件在不同的线程上处理,您可能需要使用
InvokeAsync(StateHasChanged)

我在问题中显示的代码中看不到任何一个。我当然可能是瞎子。

© www.soinside.com 2019 - 2024. All rights reserved.