我想要这样的东西:
on UI.keydown textfield $\c -> when (c == 13) $void $do
trigger UI.click button
也就是说,有什么东西像我刚刚插入的触发器功能?
最佳答案 为了将Enter按键处理为按钮点击,您不需要按字面意思触发点击.相反,您需要在按键或单击发生时触发的事件.最简单的方法,特别是如果你已经在使用Threepenny的FRP组合器(我衷心推荐),是通过
unionWith
.使用它和其他一些Reactive.Threepenny组合器,代码可能如下所示:
-- I'm giving separate names to the events for extra clarity.
let eClick = UI.click button
eEnter = void $filterE (== 13) (UI.keydown textfield)
-- This event is fired whenever `eClick` or `eEnter` happen.
eGo = unionWith const eClick eEnter
然后,您只需使用onEvent
处理eGo,就像处理点击事件一样.
请注意,在您的问题中,伪代码的精神中的另一种解决方案是通过newEvent
定义eGo,然后使用触发器功能在click和keypress的处理程序中触发事件:
-- Assuming you are in an `UI` do-block, thus the `liftIO`.
(eGo, fireGo) <- liftIO newEvent
on UI.click button $\_ -> fireGo ()
on UI.keydown textfield $\c -> when (c == 13) (fireGo ())
-- Alternatively, you might define an `eEnter` with `filterE`,
-- as in the first example, instead of using `on` and `when`.
这不像第一个解决方案那么好,因为它有点混乱,并且使用FRP代码不能很顺利.我不推荐它,除非您根本不使用FRP组合器.