Support event subscriptions in iced_web

Also improves the overall web runtime, avoiding nested update loops.
This commit is contained in:
Héctor Ramón Jiménez 2020-02-04 03:28:47 +01:00
parent f5186f31f1
commit 6d46833eb2
12 changed files with 112 additions and 129 deletions

View file

@ -163,10 +163,8 @@ where
if let Some(on_press) = self.on_press.clone() {
let event_bus = bus.clone();
node = node.on("click", move |root, vdom, _event| {
event_bus.publish(on_press.clone(), root);
vdom.schedule_render();
node = node.on("click", move |_root, _vdom, _event| {
event_bus.publish(on_press.clone());
});
}

View file

@ -84,9 +84,9 @@ where
input(bump)
.attr("type", "checkbox")
.bool_attr("checked", self.is_checked)
.on("click", move |root, vdom, _event| {
.on("click", move |_root, vdom, _event| {
let msg = on_toggle(!is_checked);
event_bus.publish(msg, root);
event_bus.publish(msg);
vdom.schedule_render();
})

View file

@ -93,10 +93,8 @@ where
.attr("type", "radio")
.attr("style", "margin-right: 10px")
.bool_attr("checked", self.is_selected)
.on("click", move |root, vdom, _event| {
event_bus.publish(on_click.clone(), root);
vdom.schedule_render();
.on("click", move |_root, _vdom, _event| {
event_bus.publish(on_click.clone());
})
.finish(),
text(radio_label.into_bump_str()),

View file

@ -111,7 +111,7 @@ where
.attr("max", max.into_bump_str())
.attr("value", value.into_bump_str())
.attr("style", "width: 100%")
.on("input", move |root, vdom, event| {
.on("input", move |_root, _vdom, event| {
let slider = match event.target().and_then(|t| {
t.dyn_into::<web_sys::HtmlInputElement>().ok()
}) {
@ -120,8 +120,7 @@ where
};
if let Ok(value) = slider.value().parse::<f32>() {
event_bus.publish(on_change(value), root);
vdom.schedule_render();
event_bus.publish(on_change(value));
}
})
.finish()

View file

@ -175,7 +175,7 @@ where
"type",
bumpalo::format!(in bump, "{}", if self.is_secure { "password" } else { "text" }).into_bump_str(),
)
.on("input", move |root, vdom, event| {
.on("input", move |_root, _vdom, event| {
let text_input = match event.target().and_then(|t| {
t.dyn_into::<web_sys::HtmlInputElement>().ok()
}) {
@ -183,8 +183,7 @@ where
Some(text_input) => text_input,
};
event_bus.publish(on_change(text_input.value()), root);
vdom.schedule_render();
event_bus.publish(on_change(text_input.value()));
})
.finish()
}