Window Event Listener
JS interop, JSinterop, IJSRuntime, IAsyncDisposable, jsModule, DotNetObjectReference, IJSObjectReference, BlazorComponent.razor.js 資源釋放等。
引言
關鍵程式碼紀錄
@*
* 監聽 Browser Window 訊息。
* 現在只支援監聽 window.focus 訊息。
* ※注意:建議放置在 page 層級,且只放一個。若同時放置多處只有最後一個有效。
*@
@using Microsoft.JSInterop
@implements IAsyncDisposable
@inject IJSRuntime jsr
@code {
[Parameter] public EventCallback OnFocus { get; set; }
//## Resource
DotNetObjectReference<WindowEventListener>? dotNetObject;
IJSObjectReference? jsModule;
public async ValueTask DisposeAsync()
{
if (jsModule != null)
{
// 反註冊監聽 Browser Window 訊息
await jsModule.InvokeVoidAsync("unregisterWindowEventHandler");
// 釋放資源
await jsModule.DisposeAsync();
}
dotNetObject?.Dispose();
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
dotNetObject = DotNetObjectReference.Create(this);
jsModule = await jsr.InvokeAsync<IJSObjectReference>(
"import", "./Shared/WindowEventListener.razor.js");
// 註冊監聽 Browser Window 訊息
await jsModule.InvokeVoidAsync("registerWindowEventHandler", dotNetObject);
}
}
[JSInvokable]
public Task OnWindowFocus() => OnFocus.InvokeAsync();
}參考文件
Last updated