我想在Blazor Wasm项目中从。net类触发一个JavaScript函数。我创建了一个类(客户端)
public class InvokeMyJavaScript
{
private readonly IJSRuntime jSRuntime;
public InvokeMyJavaScript(IJSRuntime jSRuntime)
{
this.jSRuntime = jSRuntime;
}
public async ValueTask InvokeMyJs()
{
await jSRuntime.InvokeVoidAsync("giveMeAMessage");
}
}
我添加到Program.cs:
builder.Services.AddTransient<InvokeJavaScript>();
在我的Razor组件中,我现在可以这样做:
[Inject]
InvokeMyJavaScript imjs { get; set; }
public async void InvokeMyJs()
{
await imjs.InvokeMyJs();
}
工作完美,感谢在这里帮助我的人。但当我在课堂上尝试这样做时,它就出错了。我试着:
[Inject]
InvokeMyJavaScript ij { get; set; }
private async Task TestnaarJs()
{
await ij.InvokeMyJs();
}
但是我收到一个错误:对象引用没有设置为对象的实例。我不知道出了什么问题……如何在类中注入?
[Inject]
属性是为组件工作的,但为了注入到正常的类中,则使用构造函数注入。阅读更多关于这里
@inject
(或[Inject]
属性)在业务中不可用。必须使用构造函数注入。通过向服务的构造函数中添加参数来添加所需的服务。
//...
private InvokeMyJavaScript ij;
//CTOR
public MyServiceClass(InvokeMyJavaScript ij) {
this.ij = ij;
}
private async Task TestnaarJs() {
await ij.InvokeMyJs();
}
//...
另外,我建议在接口后面抽象InvokeMyJavaScript
,注入抽象而不是具体的实现,以避免与实现细节/关注点紧密耦合。