如何从 Blazor C# 代码调用静态 JavaScript 方法

Har*_*rry 6 javascript c# interop blazor

首先,我的JS:

class MyClass {
    static myMethod() {
        alert("TEST");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的 JS 运行时注入如下:

[Inject] protected IJSRuntime Js { get; set; }
Run Code Online (Sandbox Code Playgroud)

我想调用这样的静态方法:

Js.InvokeVoidAsync("MyClass.myMethod");
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

Microsoft.JSInterop.JSException:在“窗口”中找不到“MyClass”。

是否有一个理智、合理的方法来解决这个问题,或者仅通过将 window.MyClass = MyClass 添加到我的 JS 中?

Pos*_*rte 0

是的,向窗口对象注册您的方法是正确的。

源代码的相关部分可以在这里找到:

https://github.com/aspnet/Extensions/tree/master/src/JSInterop

仔细一看你会发现:

invokeJSFromDotNet: (identifier: string, argsJson: string) => { ... }
Run Code Online (Sandbox Code Playgroud)

在哪里

@param 标识符 标识要调用的全局可访问函数。

看一下,findJSFunction您会看到检查给定标识符是否已在窗口对象中注册的部分,如果没有,则会生成您看到的错误:

function findJSFunction(identifier: string): Function {

(...)

    let result: any = window;
    let resultIdentifier = 'window';
    let lastSegmentValue: any;
    identifier.split('.').forEach(segment => {
      if (segment in result) {
        lastSegmentValue = result;
        result = result[segment];
        resultIdentifier += '.' + segment;
      } else {
        throw new Error(`Could not find '${segment}' in '${resultIdentifier}'.`);
      }
    });
Run Code Online (Sandbox Code Playgroud)