Blazor Unmarshalled JavaScript 互操作
Blazor Unmarshalled JavaScript interop
为了提高 Blazor JS Interop 调用的性能,同步和未编组的 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)
- 函数 Blazor.platform.* 定义在哪里?
- 应该使用哪一个来检索 ElementReference 类型的参数?
- 函数readStringField的第二个int参数是什么,应该如何使用?
Blazor
对象是全局命名空间 (window
) 中的 JavaScript 对象,由 blazor.webassembly.js
在 Blazor WebAssembly 中添加,或 blazor.server.js
在 Blazor Server 中添加。它通过以下脚本添加到 index.html(或 _Host.cshtml)末尾的 Blazor Apps 默认模板中:
<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函数的输入(结构或class),index是它在struct/class定义中的字段偏移量。您可以在 Microsoft 文档 here 中阅读有关字段偏移量的更多信息。
这是一些例子:
[StructLayout(LayoutKind.Explicit)]
public struct InteropStruct
{
[FieldOffset(0)]
public string Name;
[FieldOffset(8)]
public int Year;
}
您还可以使用 BINDING
直接从 JavaScript 函数 return 一个 .Net 对象,如下所示:
return BINDING.js_string_to_mono_string(`Hello, ${name} (${year})!`);
您可以在浏览器开发人员工具中发现更多关于这两个对象的信息,例如通过编写 Blazor.platform.
或 BINDING.
:
为了提高 Blazor JS Interop 调用的性能,同步和未编组的 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)
- 函数 Blazor.platform.* 定义在哪里?
- 应该使用哪一个来检索 ElementReference 类型的参数?
- 函数readStringField的第二个int参数是什么,应该如何使用?
Blazor
对象是全局命名空间 (window
) 中的 JavaScript 对象,由 blazor.webassembly.js
在 Blazor WebAssembly 中添加,或 blazor.server.js
在 Blazor Server 中添加。它通过以下脚本添加到 index.html(或 _Host.cshtml)末尾的 Blazor Apps 默认模板中:
<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函数的输入(结构或class),index是它在struct/class定义中的字段偏移量。您可以在 Microsoft 文档 here 中阅读有关字段偏移量的更多信息。 这是一些例子:
[StructLayout(LayoutKind.Explicit)]
public struct InteropStruct
{
[FieldOffset(0)]
public string Name;
[FieldOffset(8)]
public int Year;
}
您还可以使用 BINDING
直接从 JavaScript 函数 return 一个 .Net 对象,如下所示:
return BINDING.js_string_to_mono_string(`Hello, ${name} (${year})!`);
您可以在浏览器开发人员工具中发现更多关于这两个对象的信息,例如通过编写 Blazor.platform.
或 BINDING.
: