我正在使用 Blazor 技术开展项目。我有时需要使用一些 JS 代码,并且需要在每个页面中包含不同的 js 文件,据我所知,唯一的方法是使用 JS 函数和 Blazor JS 调用添加它。所以我所做的是:
在 _Host.razor 中
function addScriptFile(fileName){
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", file);
document.getElementById(divName).appendChild(script);
}
然后在每个页面(组件)中:
@inject IJSRuntime Js;
@functions{
protected override async void OnAfterRender()
{
await Js.InvokeAsync<object>("addScriptFile","~/js/myFile.js");
}
}
它工作正常,但如果重新加载页面就会出现问题。它抛出一个错误
System.InvalidOperationException:此时无法发出 JavaScript 互操作调用。这是因为组件正在预渲染,并且页面尚未加载到浏览器中,或者电路当前已断开连接。组件必须将任何 JavaScript 互操作调用包装在条件逻辑中,以确保在预渲染期间或客户端断开连接时不会尝试这些互操作调用。
我从这个错误中了解到,我试图在渲染完成之前调用一些 javascript 代码。所以我使用 IComponentContext 来确保服务器已连接。
在解决此问题的过程中,我创建了一个没有任何 JS 文件的新 Blazor 项目,但它在重新加载页面时引发了相同的错误
我试着做这个:
@inject IComponentContext ComponentContext
@functions{
protected override void OnAfterRender()
{
if(ComponentContext.IsConnected)
{
//adding scripts
}
}
}
如何让 JS 以合适的方式与 Blazor 一起工作?
以及如何修复该错误?
在您的代码示例中,存在几个问题。
@inject IJSRuntime Js;
@functions {
protected override async void OnAfterRender()
{
await Js.InvokeAsync<object>("addScriptFile","~/js/myFile.js");
}
}
首先,你应该使用code
not functions
. Code
特定于 Blazor 组件,functions
用于 Razor 页面和 MVC。
其次,永远不要使用async void
在 Blazor 中,规则的例外是在事件处理程序中运行异步代码。看本文 https://msdn.microsoft.com/en-us/magazine/jj991977.aspx了解更多信息。
第三,你有~
脚本位置开头的字符。这个角色不适用于 Blazor(而且在我看来毫无意义),它仅适用于 MVC 和 Razor Pages。如果您想从应用程序的根目录加载脚本,那么只需使用/
,如果您想从相对位置加载它,则不要在该位置前添加任何前缀。
综上所述,我认为您的代码应该如下所示。
@inject IJSRuntime Js;
@inject IComponentContext ComponentContext
@code {
protected override async Task OnAfterRenderAsync()
{
if (!ComponentContext.IsConnected)
{
return;
}
await Js.InvokeAsync<object>("addScriptFile","/js/myFile.js");
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)