0

当刷新或手动导航到使用 javascript 互操作的 Blazor 页面时,它会出错,因为 javascript 中不再存在 dispose 函数。

有没有办法在刷新或导航时不在实现 IDisposable 的组件上运行“dispose”?“ElementReference”类型在哪里有帮助?

这是上下文的一些代码:

我的 blazor 组件实现了 IDisposable:

@implements IDisposable

这将运行我的 Dispose 函数,该函数调用我的互操作文件:

public void Dispose()
{
    JqxWindowJsInterop.Dispose();
}

我的 JsInterop 运行这个对 javascript 的调用:

public void Dispose()
    {
        jsRuntime.InvokeAsync<string>(
            "jqxWindowComponent.dispose",
            InstanceId);
        _JqxWindowJsInteropReference?.Dispose();
    }

最后在javascript中运行它:

window.jqxWindowComponent = {
dispose: function (instanceId) {
    console.log('jqxWindowComponent.dispose : ' + instanceId);
    if ($('#' + instanceId).length) {
        $('#' + instanceId).jqxWindow('destroy');
    }
    delete jqxWindowList[instanceId];       
}};

当我通过浏览器刷新或导航到/从该页面导航到此页面时,我收到此错误

System.NullReferenceException:'对象引用未设置为对象的实例。'MyNameSpace.Components.JqxWindowComponent.JqxWindowJsInterop.get 返回 null。

任何帮助表示赞赏。

4

1 回答 1

3

我能够通过添加渲染检查属性来解决这个问题。

private bool firstRenderComplete;

我在这里设置:

protected override async Task OnAfterRenderAsync(bool firstRender)
{
    if (firstRender)
    {
        firstRenderComplete = true;
        DayPilotJsInterop = new DayPilotJsInterop(JavascriptRunTime, InstanceId);

        await DayPilotJsInterop.Initialize();
    }
}

最后在这里测试一下:

public void Dispose()
{
    if(firstRenderComplete == true)
    {
        DayPilotJsInterop.Dispose();
    }

}
于 2020-10-31T03:01:24.143 回答