【问题标题】:How do I ensure the right HTML element is passed from JavaScript to my Rust function?如何确保正确的HTML元素从JavaScript传递给我的Rust功能?
【发布时间】:2020-01-30 23:19:04
【问题描述】:

如果我使用接受 HtmlCanvasElement 的 wasm_bindgen 创建一个 Rust 函数,我如何确保它在到达 Rust 端时失败?

JavaScript:

(async () => {
    const demo = await import('./pkg/demo').catch(console.error);
    demo.setCanvas('Hello Element!');  
})();

生锈:

use wasm_bindgen::prelude::*;
use web_sys::{console, HtmlCanvasElement};

#[wasm_bindgen]
pub fn setCanvas(canvas: &HtmlCanvasElement) {
    //  Why does this even get here? I didn't pass in an HtmlCanvasElement
    console::log_1(&canvas);
}

看起来我得到了HtmlCanvasElement 类型,但如果我尝试将它用作HtmlCanvasElement,它没有这些功能,因为我传入的是字符串而不是实际的画布元素。我希望它在设置时失败,而不是在以后尝试使用它时失败。

【问题讨论】:

  • wasm_bindgen 中 DOM 和 Rust 的边界没有太多类型控制。我认为这是一个额外的库或框架的工作(可以很小,也可以是你自己的,你没有必须为此使用另一个板条箱)。
  • 我什至不知道去哪里查看如何检查它是否确实是我的代码中的画布对象。
  • 在大多数情况下,您可以使用dyn_into(如this)进行检查
  • #[wasm_bindgen] pub fn setElement(canvas: HtmlCanvasElement) -> Result { match canvas.dyn_into::() ... ...这看起来很奇怪将其转换为相同的类型
  • 非常感谢您!虽然我不明白这里发生了什么,但它确实有效。你会建议我去哪里阅读更多关于内部工作原理的信息?

标签: rust wasm-bindgen


【解决方案1】:

在 wasm_bindgen 中,DOM 和 Rust 之间的边界没有太多类型控制。 JavaScript 部分处理来自 Rust 的JsValue

这意味着您必须自己进行检查转换(或让未来的库或框架为您完成)。

JsCast trait 对此有所帮助。例如,它可以让你这样写:

#[wasm_bindgen]
pub fn setElement(canvas: JsValue) -> Result<(), JsValue> {
    match canvas.dyn_into::<HtmlCanvasElement>() {
        Ok(canvas) => {
            // ...

            Ok(())
        }
        Err(_) => Err(JsValue::from_str("argument not a HtmlCanvas")),
    }
}

【讨论】:

    猜你喜欢
    • 2016-04-19
    • 2019-12-23
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多