У меня есть Syncfusion SfDialog в моем коде, и мне нужно, чтобы компонент в содержимом перезапускался каждый раз, когда открывается диалоговое окно. До сих пор я пробовал это:
<SfDialog Visible = "_dialogTripRunAutoRoute" Width = "75%" ShowCloseIcon = "true" IsModal = "true" AllowPrerender = "true">
<DialogEvents Closed = "@CloseDialogTripRunAutoRoute"></DialogEvents>
<DialogTemplates>
<Content>
@_tripRunAutoRoute
</Content>
</DialogTemplates>
<DialogPositionData X = "center" Y = "top"></DialogPositionData>
</SfDialog>
private async Task ToggleDialogTripRunAutoRoute(){
_tripRunAutoRoute = new TripRunAutoRoute();
_tripRunAutoRoute.ModelTripRun = TripOps.TripRunAutoRouteFormModel;
await InvokeAsync(StateHasChanged);
_dialogTripRunAutoRoute = !_dialogTripRunAutoRoute;
}
Результат
Мне нужно, чтобы компонент в содержимом перезапускался каждый раз, когда открывается диалоговое окно.
Вы можете заставить Blazor перезапустить компонент, назначив компоненту ключевой атрибут. Когда вы меняете ключ, Blazor заново создает компонент в DOM, таким образом, вы можете называть его перезапущенным или перезагруженным.
<ComponentInTheContent @key = "@(componentId)">
</ComponentInTheContent>
@code {
private Guid componentId = Guid.NewGuid();
private async Task CalledWhenDialogIsOpened()
{
// stuff
// this change of id will make Blazor re-create
// the component in the DOM as it sees it as a new component.
componentId = Guid.NewGuid();
}
}
Предположение. @_tripRunAutoRoute — это просто старый добрый RenderFragment.
Вы не можете «перезапустить» компонент. Рендерер управляет жизненным циклом компонента, а не вы. Любая попытка сбросить его состояние внутри будет отменена при следующем отображении страницы.
Переместите параметр переключения за пределы элемента управления следующим образом:
@if (_dialogTripRunAutoRoute)
{
SfDialog stuff
}
Теперь рендерер удалит компонент из дерева рендеринга, когда _dialogTripRunAutoRoute
будет ложным, и создаст новый экземпляр, если он истинный.
Вы можете использовать события Opened и Closed элемента управления Dialog для повторного рендеринга компонента, добавленного в содержимое Dialog. См. API и код ниже,
<div class = " col-lg-8 control-section sb-property-border" id = "target" style = "height:350px;">
<div>
@if (this.ShowButton)
{
<button class = "e-btn" @onclick = "@OnBtnClick">Open</button>
}
</div>
<SfDialog Width = "335px" IsModal = "true" @bind-Visible = "Visibility" AllowPrerender = "true" CssClass = "dialog-medium">
<DialogTemplates>
<Header> Software Update </Header>
<Content>
@if (DialogBool)
{
@DialogContent
<div>@count</div>
}
</Content>
</DialogTemplates>
<DialogButtons>
<DialogButton Content = "OK" IsPrimary = "true" OnClick = "@DlgButtonClick" />
</DialogButtons>
<DialogEvents OnOpen = "@DialogOpen" Closed = "@DialogClose"></DialogEvents>
<DialogAnimationSettings Effect = "@DialogEffect.None"></DialogAnimationSettings>
</SfDialog>
@код {
SfCheckBox<bool> CheckboxObj;
public int count { get; set; } = 0;
public bool DialogBool { get; set; } = false;
public string DialogContent { get; set; } = "";
private bool Visibility { get; set; } = true;
private bool ShowButton { get; set; } = false;
private void DialogOpen(Object args)
{
this.ShowButton = false;
DialogBool = true;
}
private void DialogClose(Object args)
{
this.ShowButton = true;
DialogBool = false;
}
private void OnBtnClick()
{
this.Visibility = true;
DialogContent = "content added";
count++;
}
private void DlgButtonClick()
{
this.Visibility = false;
}
}