Better event handler conversion.
This commit is contained in:
parent
a9dc58da9c
commit
2b95530637
|
@ -193,7 +193,7 @@ impl Element {
|
|||
let key = TokenTree::Ident(key.clone());
|
||||
let value = process_value(value);
|
||||
body.extend(quote!(
|
||||
element.events.$key = Some(Box::new($value));
|
||||
element.events.$key = Some(typed_html::events::IntoEventHandler::into_event_handler($value));
|
||||
));
|
||||
}
|
||||
|
||||
|
|
|
@ -112,6 +112,10 @@ pub trait EventHandler<EventType> {
|
|||
fn render(&self) -> Option<String>;
|
||||
}
|
||||
|
||||
pub trait IntoEventHandler<E> {
|
||||
fn into_event_handler(self) -> Box<dyn EventHandler<E>>;
|
||||
}
|
||||
|
||||
pub struct EFn<F, E>(Option<F>, PhantomData<E>);
|
||||
|
||||
impl<F, E> EFn<F, E>
|
||||
|
@ -124,6 +128,26 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<F, E> IntoEventHandler<E> for EFn<F, E>
|
||||
where
|
||||
F: FnMut(E) + 'static,
|
||||
E: ConcreteEvent + 'static,
|
||||
{
|
||||
fn into_event_handler(self) -> Box<dyn EventHandler<E>> {
|
||||
Box::new(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl<F, E> IntoEventHandler<E> for F
|
||||
where
|
||||
F: FnMut(E) + 'static,
|
||||
E: ConcreteEvent + 'static,
|
||||
{
|
||||
fn into_event_handler(self) -> Box<dyn EventHandler<E>> {
|
||||
Box::new(EFn::new(self))
|
||||
}
|
||||
}
|
||||
|
||||
impl<F, E> EventHandler<E> for EFn<F, E>
|
||||
where
|
||||
F: FnMut(E) + 'static,
|
||||
|
@ -139,7 +163,7 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a, EventType> EventHandler<EventType> for &'a str {
|
||||
impl<E> EventHandler<E> for &'static str {
|
||||
fn attach(&mut self, _target: &Element) -> EventListenerHandle {
|
||||
panic!("Silly wabbit, strings as event handlers are only for printing.");
|
||||
}
|
||||
|
@ -148,3 +172,9 @@ impl<'a, EventType> EventHandler<EventType> for &'a str {
|
|||
Some(self.to_string())
|
||||
}
|
||||
}
|
||||
|
||||
impl<E> IntoEventHandler<E> for &'static str {
|
||||
fn into_event_handler(self) -> Box<dyn EventHandler<E>> {
|
||||
Box::new(self)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,9 +6,9 @@ extern crate typed_html;
|
|||
extern crate typed_html_macros;
|
||||
|
||||
use stdweb::web::{self, Element, IElement, INode};
|
||||
use typed_html::for_events;
|
||||
use typed_html::dom::{Node, VNode};
|
||||
use typed_html::events::{EFn, Events};
|
||||
use typed_html::events::Events;
|
||||
use typed_html::for_events;
|
||||
use typed_html_macros::html;
|
||||
|
||||
fn install_handlers(target: &Element, handlers: &mut Events) {
|
||||
|
@ -47,7 +47,7 @@ fn main() {
|
|||
". She is a "<em>"human girl"</em>"."
|
||||
</p>
|
||||
<p>
|
||||
<button onclick=EFn::new(|_event| web::alert("Hello Joe!"))>
|
||||
<button onclick=(|_event| web::alert("Hello Joe!"))>
|
||||
"Call Joe"
|
||||
</button>
|
||||
</p>
|
||||
|
|
Loading…
Reference in New Issue