Explorar o código

expose listener methods

Evan Almloff %!s(int64=2) %!d(string=hai) anos
pai
achega
6cf0274a5b
Modificáronse 1 ficheiros con 31 adicións e 23 borrados
  1. 31 23
      packages/native-core/src/real_dom.rs

+ 31 - 23
packages/native-core/src/real_dom.rs

@@ -329,31 +329,11 @@ impl<V: FromAnyValue + Send + Sync> RealDom<V> {
                 }
                 NewEventListener { name, id } => {
                     let node_id = self.element_to_node_id(id);
-                    let mut node = self.get_mut(node_id).unwrap();
-                    if let NodeTypeMut::Element(mut element) = node.node_type_mut() {
-                        element.listeners_mut().insert(name.to_string());
-                        drop(node);
-                        match self.nodes_listening.get_mut(name) {
-                            Some(hs) => {
-                                hs.insert(node_id);
-                            }
-                            None => {
-                                let mut hs = FxHashSet::default();
-                                hs.insert(node_id);
-                                self.nodes_listening.insert(name.to_string(), hs);
-                            }
-                        }
-                    }
+                    self.add_event_listener(node_id, name);
                 }
                 RemoveEventListener { id, name } => {
                     let node_id = self.element_to_node_id(id);
-                    {
-                        let mut node = self.get_mut(node_id).unwrap();
-                        if let NodeTypeMut::Element(mut element) = node.node_type_mut() {
-                            element.listeners_mut().remove(name);
-                        }
-                    }
-                    self.nodes_listening.get_mut(name).unwrap().remove(&node_id);
+                    self.remove_event_listener(node_id, name);
                 }
                 Remove { id } => {
                     let node_id = self.element_to_node_id(id);
@@ -369,7 +349,7 @@ impl<V: FromAnyValue + Send + Sync> RealDom<V> {
 
     /// Find all nodes that are listening for an event, sorted by there height in the dom progressing starting at the bottom and progressing up.
     /// This can be useful to avoid creating duplicate events.
-    pub fn get_listening_sorted(&self, event: &'static str) -> Vec<NodeRef<V>> {
+    pub fn get_listening_sorted(&self, event: &str) -> Vec<NodeRef<V>> {
         if let Some(nodes) = self.nodes_listening.get(event) {
             let mut listening: Vec<_> = nodes
                 .iter()
@@ -490,6 +470,34 @@ impl<V: FromAnyValue + Send + Sync> RealDom<V> {
         self.tree.insert_after(id, new);
     }
 
+    pub fn add_event_listener(&mut self, id: NodeId, event: &str) {
+        let mut node = self.get_mut(id).unwrap();
+        if let NodeTypeMut::Element(mut element) = node.node_type_mut() {
+            element.listeners_mut().insert(event.to_string());
+            drop(node);
+            match self.nodes_listening.get_mut(event) {
+                Some(hs) => {
+                    hs.insert(id);
+                }
+                None => {
+                    let mut hs = FxHashSet::default();
+                    hs.insert(id);
+                    self.nodes_listening.insert(event.to_string(), hs);
+                }
+            }
+        }
+    }
+
+    pub fn remove_event_listener(&mut self, id: NodeId, event: &str) {
+        {
+            let mut node = self.get_mut(id).unwrap();
+            if let NodeTypeMut::Element(mut element) = node.node_type_mut() {
+                element.listeners_mut().remove(event);
+            }
+        }
+        self.nodes_listening.get_mut(event).unwrap().remove(&id);
+    }
+
     pub fn traverse_depth_first(&self, mut f: impl FnMut(NodeRef<V>)) {
         let mut stack = vec![self.root()];
         while let Some(id) = stack.pop() {