【发布时间】:2021-08-31 15:00:27
【问题描述】:
我有一个非常基本的 Javascript 函数存储在一个单独的 JS 文件中,它为一个新的 Blazor 应用程序设置页面标题,如下所示:
window.setTitle = (title, icon) => {
//title
document.title = title;
$("#page_title").html(title);
//page icon
$("#page_icon").removeClass().addClass('fad fa-' + icon + ' fa-2x');
}
这一切都很好,除了通过浏览器点击应用程序时冷启动。当我尝试访问该站点并且有一段时间没有被访问时,我最终会在控制台中显示以下内容:
Microsoft.JSInterop.JSException: Could not find 'setTitle' ('setTitle' was undefined).
Error: Could not find 'setTitle' ('setTitle' was undefined).
at https://example.com/_framework/blazor.webassembly.js:1:1287
at Array.forEach (<anonymous>)
at e.findFunction (https://example.com/_framework/blazor.webassembly.js:1:1247)
at b (https://example.com/_framework/blazor.webassembly.js:1:2989)
at https://example.com/_framework/blazor.webassembly.js:1:3935
at new Promise (<anonymous>)
at Object.beginInvokeJSFromDotNet (https://example.com/_framework/blazor.webassembly.js:1:3908)
at Object.w [as invokeJSFromDotNet] (https://example.com/_framework/blazor.webassembly.js:1:64218)
at _mono_wasm_invoke_js_blazor (https://example.com/_framework/dotnet.5.0.6.js:1:190800)
at do_icall (<anonymous>:wasm-function[10596]:0x194e4e)
at Microsoft.JSInterop.JSRuntime.<InvokeAsync>d__15`1[[System.Object, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()
at Microsoft.JSInterop.JSRuntimeExtensions.InvokeVoidAsync(IJSRuntime jsRuntime, String identifier, Object[] args)
at App.Web.Portal.Client.Shared.PageTitle.OnAfterRenderAsync(Boolean firstRender)
at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle)
d.printErr @ blazor.webassembly.js:1
让我感到困惑的部分是,如果我只是进行硬刷新(CTRL + Shift + R),那么一切都可以完美加载并且运行良好无需任何更改或部署。鉴于此,我真的不知道该怎么做或在哪里寻找如何纠正这个问题。
有没有其他人以前见过这种情况或有任何关于如何防止它的提示?自 2003 年以来我一直在做 .Net,但自 2021 年起我是 Blazor 的新手,所以我学到了很多东西,但这个让我很难过。
提前致谢!
【问题讨论】:
-
在哪里加载包含setTitle的js文件?
-
它在 "wwwroot\index.html" 内,并作为标准 JS 文件链接:
<script src="assets/js/custom.js"></script>,就在结束</body>标记上方 - 这是最后一个链接的脚本文件。 -
嗨,您在哪里通过 Blazor SPA 中的 JsInterop 呼叫
setTitle?并定义你如何cold restart你的应用程序。 -
整个应用程序是安全的(意味着除了登录屏幕之外没有公共页面),所以登录是错误所在,但我必须等待/看看它是否再次出现如果堆栈跟踪会告诉我它是从哪里触发的。登录页面本身不使用该功能,因此,当您询问单击了一个灯泡并且现在我很好奇 :-) 关于冷启动时,这仅意味着它是通过 IIS 托管的,并且没有人去过它至少几天,所以 IIS 第一次启动它。一旦我可以再次复制它,就会有更多!
标签: javascript asp.net-core blazor asp.net5