我有一个名为 _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 会命中,但它不会命中子页面组件。
请帮我解决这个问题。
仅更改父级上用作子级参数的属性/字段的值不会触发子级的渲染。
在正常情况下,组件会因以下原因而发生突变:
对于前者,渲染内置于组件的 UI 处理代码中。
对于后者,您需要在事件处理程序中手动调用
StateHasChanged
。如果事件在不同的线程上处理,您可能需要使用 InvokeAsync(StateHasChanged)
。
我在问题中显示的代码中看不到任何一个。我当然可能是瞎子。