0

为了提高 Blazor JS 互操作调用的性能,可以使用同步和未编组的 api

我很难找到有关未编组的更多信息。

例如:

//javascript
JSFunctions.f1 = function (fields) {
    var f1 = Blazor.platform.readStringField(fields, 0);
    var f2 = Blazor.platform.readStringField(fields, 4);
    var f3 = Blazor.platform.readStringField(fields, 8);
};


//F#
[<Inject>]
member val Js: IJSRuntime
let js = this.Js :?> IJSUnmarshalledRuntime
js.InvokeUnmarshalled<ElementReference, string, unit>("JSFunctions.f1", er, txt)
  1. Blazor.platform.* 函数在哪里定义?
  2. 应该使用哪一个来检索 ElementReference 类型的参数?
  3. 函数 readStringField 的第二个 int 参数是什么,应该如何使用?
4

1 回答 1

1

Blazorobject 是全局命名空间 ( window) 中的 JavaScript 对象,由blazor.webassembly.jsBlazor WebAssembly 或blazor.server.jsBlazor Server 添加。它通过以下脚本在 index.html(或 _Host.cshtml)末尾添加了 Blazor 应用程序的默认模板:

<script autostart="false" src="_framework/blazor.webassembly.js"></script>

Blazor对象提供Blazor.platform 了一些有用的 api,例如start()用于手动启动 Blazor。此脚本还添加另一个名为BINDING全局命名空间的对象(window.BINDING或简单地BINDING)。它们提供了直接从 JavaScript 以非编组方式处理 .NET 对象的方法。例如,您可以使用读取不同类型的数据

Blazor.platform.read....

您可以使用以下方法读取对象ElementReference类型对象:

Blazor.platform.readObjectField(fields,index)

这里的 fields 是调用它时传递给 JS 函数的输入(结构或类), index 是它在结构/类定义中的字段偏移量。您可以在此处阅读 Microsoft 文档中有关字段偏移的更多信息。下面是一些例子:

[StructLayout(LayoutKind.Explicit)]
    public struct InteropStruct
    {
        [FieldOffset(0)]
        public string Name;

        [FieldOffset(8)]
        public int Year;
    }

您还可以使用BINDING以下方式直接从 JavaScript 函数返回一个 .Net 对象:

return BINDING.js_string_to_mono_string(`Hello, ${name} (${year})!`);

您可以在浏览器开发工具中发现更多关于这两个对象的信息,例如通过编写Blazor.platform.BINDING.

于 2022-03-04T21:35:42.877 回答