Blazor - 从 C# class 调用 JavaScript

Blazor - Call JavaScript from C# class

这是我想要实现的目标:

我在 Blazor WASM 项目中有一个(正常)class。我想从我的 class 调用一个 JavaScript 函数。 如果我想从 Razor 组件执行此操作,它工作正常,我将 IJSruntime 和 invokevoidasync 注入我的 JavaScript.

但是当我尝试从 class 执行它时出错了。 首先我试着像这样注入它:

[Inject]
IJSRuntime JSRuntime { get; set; }

但最终出现错误消息:值不能为空。 (参数'jsRuntime') 我从 this post 了解到我必须“以传统方式注入它”,所以我这样做了:

public class InvokeJavaScript
{
    private readonly IJSRuntime jSRuntime;

    public InvokeJavaScript(IJSRuntime jSRuntime)
    {
        this.jSRuntime = jSRuntime;
    }

    public async void InvokeMyJs()
    {
        await jSRuntime.InvokeVoidAsync("giveMeAMessage");
    }
}

但从那以后我就卡住了,我知道这一定是一些关键的 .NET 知识,但我在这里遗漏了一块。我想调用“InvokeMyJs”方法,如:

InvokeJavaScript ij = new InvokeJavaScript();
ij.InvokeMyJs();

但是我知道我正面临一个错误:没有给定的参数对应于 'InvokeJavaScript.InvokeJavaScript(IJSRuntime)'

的必需形式参数 'jSRuntime'

我收到的错误对我来说很有意义,但我不知道如何修复它,我必须向 InvokeJavaScript(IJSRuntime jSRuntime) 发送什么参数以及如何正确执行?谁能举个例子?

当你使用 DI 时,你必须遵循它。
一般来说,这意味着避免 new,如:

InvokeJavaScript ij = new InvokeJavaScript();  // no parameter
  • 在启动中将 InvokeJavaScript 注册为服务。
  • 将它注入到你需要的地方。

Program.cs

builder.Services.AddTransient<InvokeJavaScript>();

SomeComponent.razor

@inject InvokeJavaScript ij