【发布时间】:2017-06-03 11:14:12
【问题描述】:
如何取消订阅keyboard-input example中除HandleKey之外的其他操作的键盘事件? (问题与 Halogen 版本 2.0.1 和 purescript 0.11.4 有关。)
在示例中,输入/返回有效。我有一组元素可以通过按下关闭按钮用鼠标折叠,关闭操作会处理它。此外,enter/return 可用于折叠元素,它可以正常工作。
Open next -> do
st <- H.get
if not st.open
then do
H.modify (_ { open = true })
eval (H.action Init)
else pure unit
pure next
Close next -> do
H.modify (_ { open = false })
st <- H.get
case st.unsubscribe of
Nothing -> pure unit
-- Just smth -> H.liftAff smth
Just _ -> H.modify (_ { unsubscribe = Nothing}) -- H.liftAff us
pure next
Init next -> do
H.modify (_ { open = true})
document <- H.liftEff $ DOM.window >>= DOM.document <#> DOM.htmlDocumentToDocument
H.subscribe $ ES.eventSource'
(K.onKeyUp document)
(Just <<< H.request <<< HandleKey)
-- H.modify (_ { unsubscribe = ??? })
pure next
问题是当我用鼠标关闭(折叠)元素时,事件侦听器没有被删除(没有完成)并且它仍然存在。当我重新打开元素时,上面的代码将建立第二个(第三个、第四个等)侦听器,然后每次按键都会被处理多次。
我正在考虑创建一个键盘事件,但在这里听起来不正确。
所以问题是:
- 如何检查是否已经有键盘监听器?
- 然后如何在 Close 动作中停止它?
- 或者是否可以制作 Done SubscribeStatus 并将其发送到 Close -action 的键盘侦听器?
其他问题:
-
example 在状态中有
unsubscribe。如何使用它? - (我尝试在 Init -action 和 Close -action 中添加一些内容,但纯属猜测。)
后期编辑: 这似乎与有关dynamically attached event listeners 的问题有关,另请参阅this、this 和this。
其中一个答案说只有通过使用状态才能了解动态处理程序,这对我的问题起到了作用。无论如何,我认为这里所说的问题仍然存在(如何使用卤素删除处理程序,尤其是示例中的取消订阅字段 - 它是否有用?)
【问题讨论】:
-
我实际上在弄清楚如何取消订阅事件源时遇到了同样的问题。当我找到一个好的解决方案时,我会写一个答案。
标签: purescript halogen