如何通过 clojurescript 通道传输 html dom 事件



我正在努力将事件系统与om-event-bus集成,它使用async/chan来传输事件。然而,事实证明html DOM事件未能通过clojurescript的异步通道传输。传输事件中的属性变为 null,并且缺少内部函数。

首先定义一个通道:

(def event-bus (chan))

设置 dom 节点并将回调函数附加到 keydown 事件。在函数中,将 put the dom 事件添加到通道中 (PS:I使用 om 作为 UI)

(dom/section #js {:id "VRE" 
                  :tabIndex 0
                  :onKeyDown  #(put! event-bus %)))

等待接收传输的事件

(go-loop
  []
  (let [e (<! event-bus)]
    (when e
      (println "go-loop received" (.stringify js/JSON e))
      (recur))))

当我键入某个键时,控制台将打印:

go-loop received {"dispatchConfig":null,
                  "dispatchMarker":null,
                  "nativeEvent":null,
                  "type":null,
                  ...
                  "_dispatchListeners":null,"_dispatchIDs":null}

所有属性均为 null,并且缺少 preventDefault 等内部函数。

我想一定有什么我不明白的地方。有人有一些修复它的想法吗?如果您能就此问题提供一些提示/技巧或其他想法,那就太好了

您正在尝试字符串化事件对象。这不是一个好主意,看看这个答案:

如何字符串化事件对象?

尝试提取有趣的信息(即按下了哪个键)并将其作为值传递给通道。

传递整个事件对象并在接收端对其进行操作可能无法实现。我在推测,但似乎事件对象在从通道中提取之前被删除。

最新更新