@implements IDisposable; @inject ISearchService SearchService @inject IJSRuntime JsRuntime @code { protected override void OnInitialized() { base.OnInitialized(); SearchService.Subscribe(OnUpdate); } protected override async Task OnInitializedAsync() { await SearchService.Load(); await JsRuntime.InvokeVoidAsync("SetDotnetReference", DotNetObjectReference.Create(this)); } void IDisposable.Dispose() { SearchService.Unsubscribe(OnUpdate); } void OnUpdate() { StateHasChanged(); } [JSInvokable("OnKeyPress")] public async Task OnKeyPress(string code, bool ctrlKey, bool shiftKey, bool altKey, bool metaKey) { if (code.ToLower().Equals("k") && (ctrlKey || shiftKey || altKey || metaKey)) { if (SearchService.IsVisible) { SearchService.Hide(); } else { SearchService.Show(); } } } }