Я пытаюсь обновить страницу Blazor
для события, сгенерированного js
. Js
, с помощью взаимодействия вызывает код C # для события, и мне нужно каким-то образом вызвать this.StateHasChanged
в обратном вызове c #:
JS
window.methods = {
timeout: null,
setTimeout: function () {
timeout = window.setInterval(async function () {
console.log("From js timeout occured ,sending to .net");
await DotNet.invokeMethodAsync('[assembly name]', "TimeoutCallback", Date.now().toString());
}, 2000);
},
clearTimeout: function () {
if (this.timeout == null || this.timeout == undefined) {
return;
}
console.log("Clearing timeout");
window.clearTimeout(timeout);
}
}
C #
@inherits StuffBase
@page "/test"
Current value: @val
<button onclick="@(async()=>await StartTimeout())">Start timeout </button>
<button onclick="@(async()=>await ClearTimeout())">Clear timeout</button>
public class StuffBase : BlazorComponent {
protected static string val { get; set; }
protected async Task StartTimeout() {
await JSMethods.SetTimeout();
}
[JSInvokable("TimeoutCallback")] //gets called by js on event !
public static async Task TimeoutCallback(string data) {
val = data;
Console.WriteLine("From callback ,received:" + data); //gets updated
await Task.Delay(1000);
//how can i call this.StateHasChanged
}
protected async Task ClearInterval() {
await JSMethods.ClearInterval();
}
}
Interop
public class JSMethods {
public static async Task SetTimeout() {
await JSRuntime.Current.InvokeAsync<string>("methods.setTimeout");
}
public static async Task ClearTimeout() {
await JSRuntime.Current.InvokeAsync<string>("methods.clearTimeout");
}
}
Как вы можете видеть сначала, я звоню с c#
-> setTimeout
, который в js прикрепляет тайм-аут со своим обработчиком.Что происходит, так это то, что мне удается получить TimeoutCallback
, вызванный из js
, но в то время как в console
я обновляю свое значение, мне как-то нужно уведомить UI
, чтобы он обновился.
Какмогу ли я достичь этого, поскольку все мои .NET
методы, которые вызываются из js
, имеют (согласно документации), равным static
?