如何在键盘输入示例中取消订阅除 HandleKey 之外的其他操作的键盘事件 ?(问题与 Halogen 2.0.1 版和 purescript 0.11.4 版有关。)
在示例中,输入/返回有效。我有一组元素可以通过按下关闭按钮用鼠标折叠,关闭操作会处理它。此外,输入/返回可用于折叠元素,它可以正常工作。
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 的键盘侦听器?
进一步的问题:
- 例子有在
unsubscribe
状态。如何使用它? - (我试图在 Init 动作和 Close 动作中放入一些东西,但这纯粹是猜测。)
后期编辑:这似乎与有关动态附加事件侦听器的问题有关,另请参见this、this和this。
其中一个答案说,只有通过使用状态才能了解动态处理程序,这对我的问题起到了作用。无论如何,我认为这里所说的问题仍然存在(如何使用卤素删除处理程序,特别是关于示例中的取消订阅字段 - 它是否有用?)