【发布时间】:2014-12-25 08:04:32
【问题描述】:
我正在寻找一种仅在鼠标按下时才响应鼠标悬停事件的好方法。我正在寻找一种更 core.async 的方式来执行此操作。
我在一个 om 组件中有两个通道:
om/IDidMount
(did-mount [_]
(let [canvas (q ".tutorial")
_ref (js/Firebase. "https://conseal.firebaseio.com/scribble")
ctx (.getContext canvas "2d")
mouse-down (om/get-state owner :mouse-down)
mouse-chan (om/get-state owner :mouse-chan)]
(listen canvas EventType.MOUSEDOWN #(put! mouse-down [:down %]))
(listen canvas EventType.MOUSEMOVE #(put! mouse-chan [:move %]))
然后我在IWillMount 中有以下go-loop:
om/IWillMount
(will-mount [_]
(let [mouse-down (om/get-state owner :mouse-down)
mouse-chan (om/get-state owner :mouse-chan) ]
(go-loop []
(<! mouse-down)
(let [[evt-type e] (<! mouse-chan)]
(.log js/console (str evt-type " we are over " e)))
(recur))))
上述方法不起作用,因为mousedown 事件不会连续发送。我正在寻找一种core.async 惯用的方式来处理这个问题。
如果我使用 rxjs,我可以这样做:
var mouseDrags = mouseDowns.select(function (downEvent) {
return mouseMoves.takeUntil(mouseUps).select(function (drag) {
return functionToGetStuffWeWant(drag);
});
});
【问题讨论】:
标签: clojure clojurescript core.async