【发布时间】:2021-10-26 20:09:11
【问题描述】:
如何将input 事件侦听器添加到HtmlInputElement/HtmlTextAreaElement。我正在使用web-sys 并阅读this,但随后,我在闭包内使用的所有元素(在本例中尤其是input 元素)都被移入闭包,之后我无法附加监听器.
let closure = Closure::wrap(Box::new(|_: web_sys::InputEvent| {
console_log!("{}", input.value());
}) as Box<dyn FnMut(_)>);
input.add_event_listener_with_callback("input", closure.as_ref().unchecked_ref())?;
// ^
// Doesn't work because the `input` variable was moved into the closure.
具体来说我明白了:
borrow of moved value: `input`
【问题讨论】:
-
您的代码不能用于重现问题,因为我们不知道这些类型是什么,他们的方法有什么接收者等等。所以没有任何进一步的信息,我只能说不要将
input变量移动到闭包中。如果需要,您可以将其包装在Rc或Rc<RefCell>>中,并移动Rc的克隆。但这可能会造成内存泄漏,因为input会为自己保存一个Rc。 -
@SvetlinZarev 你在说什么“类型”?我的意思是这里的所有类型都来自
web-sys(和wasm-bindgen)。我将不得不阅读所谓的“Rc”。 -
好吧,如果不存在导入并且从未提及
web-sys,那么任何人都怎么知道他们来自web-sys? -
@SvetlinZarev 我认为这是标准。对不起,我对这一切都不熟悉,包括生锈。从理论上讲,该链接指向一个关于
web-sys的 wiki,但您是对的。我将添加导入。 -
是的,我已将其删除,因为我不确定 100%。我已经恢复了,如果有帮助的话。如果
Weak指针返回None,您可以尝试使用Rc代替它。