Blazor - 从 C# 类调用 JavaScript [英] Blazor - Call JavaScript from C# class

查看:34
本文介绍了Blazor - 从 C# 类调用 JavaScript的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我想要实现的目标:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆