Web-Development-with-Blazor.../Chapter07/MyBlog/Components/RazorComponents/BlogNavigationLock.razor
2023-02-17 15:28:17 +01:00

43 lines
1.2 KiB
Plaintext

@inject IJSRuntime JSRuntime
@implements IDisposable
<NavigationLock
ConfirmExternalNavigation="@(CurrentEditContext.IsModified())"
OnBeforeInternalNavigation="OnBeforeInternalNavigation" />
@code{
[CascadingParameter]
public required EditContext CurrentEditContext { get; set; }
public string InternalNavigationMessage { get; set; } = "You are about to loose changes, are you sure you want to navigate away?";
protected override Task OnInitializedAsync()
{
CurrentEditContext.OnFieldChanged += OnFieldChangedAsync;
return base.OnInitializedAsync();
}
private async void OnFieldChangedAsync(object? sender,FieldChangedEventArgs args)
{
await InvokeAsync(StateHasChanged);
}
private async Task OnBeforeInternalNavigation(LocationChangingContext context)
{
if (CurrentEditContext.IsModified())
{
var isConfirmed = await JSRuntime.InvokeAsync<bool>("confirm",
InternalNavigationMessage);
if (!isConfirmed)
{
context.PreventNavigation();
}
}
}
void IDisposable.Dispose()
{
CurrentEditContext.OnFieldChanged -= OnFieldChangedAsync;
}
}