Blazor - 从 C# 类调用 JavaScript [英] Blazor - Call JavaScript from C# class
问题描述
这是我想要实现的目标:
Here is what I want to achieve:
我在 Blazor WASM 项目中有一个(普通)类.我想从我的类中调用一个 JavaScript 函数.如果我想从 Razor 组件执行此操作,它工作正常,我会将 IJSruntime 和 invokevoidasync 注入我的 JavaScript.
I have a (normal) class in a Blazor WASM project. I want to invoke a JavaScript function from my class. If I want to do this from a Razor component it is working fine, I inject IJSruntime and invokevoidasync to my JavaScript.
但是当我尝试在课堂上做这件事时出错了.首先,我尝试像这样注入它:
But it goes wrong when I try to do it from a class. First I tried to inject it like this:
[Inject]
IJSRuntime JSRuntime { get; set; }
但最终得到错误消息:值不能为空.(参数'jsRuntime')我从这篇帖子中了解到我必须"以传统方式注入它",所以我这样做了:
But ended up with error message: Value cannot be null. (Parameter 'jsRuntime') I learned from this post that I have to "Inject it in the traditonal way", so I did this:
public class InvokeJavaScript
{
private readonly IJSRuntime jSRuntime;
public InvokeJavaScript(IJSRuntime jSRuntime)
{
this.jSRuntime = jSRuntime;
}
public async void InvokeMyJs()
{
await jSRuntime.InvokeVoidAsync("giveMeAMessage");
}
}
但是从那以后我就被卡住了,我知道这一定是一些关键的 .NET 知识,但我在这里遗漏了一部分..我想调用InvokeMyJs"方法如:
But from there on I am stuck, I know that this must be some key .NET knowledge but I am missing a piece here.. I want to call the "InvokeMyJs" methode like:
InvokeJavaScript ij = new InvokeJavaScript();
ij.InvokeMyJs();
但知道我正面临一个错误:没有给出与InvokeJavaScript.InvokeJavaScript(IJSRuntime)"的必需形式参数jSRuntime"相对应的参数
But know I am facing an error: There is no argument given that corresponds to the required formal parameter 'jSRuntime' of 'InvokeJavaScript.InvokeJavaScript(IJSRuntime)'
我得到的错误对我来说很有意义,但我不知道如何修复它,我必须向 InvokeJavaScript(IJSRuntime jSRuntime) 发送什么参数以及如何正确执行?谁能举个例子?
That I get the error makes sense to me but I dont know how to fix it, what parameter must I send to InvokeJavaScript(IJSRuntime jSRuntime) and how do I do it correctly? Can anyone give an example?
推荐答案
当您使用 DI 时,您必须遵循它.
一般来说,这意味着避免 new
,例如:
When you use DI you have to follow it through.
In general that means avoiding new
, as in:
InvokeJavaScript ij = new InvokeJavaScript(); // no parameter
- 在启动时将 InvokeJavaScript 注册为服务.
- 将其注入您需要的地方.
builder.Services.AddTransient<InvokeJavaScript>();
SomeComponent.razor
@inject InvokeJavaScript ij
这篇关于Blazor - 从 C# 类调用 JavaScript的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!