在我的自定义 Halogen/Purescript 项目中,我遵循 AJAX Example 中的模式,在那里我将我的操作分成纯 Input
和有效的 Request
。
我想更改我的事件处理程序以使用 preventDefault
行为,但不明白这对 UI 函数的类型有什么影响。
我通过以下方式更改事件处理程序对 AJAX 示例进行了相同的更改:
前:
H.button [ A.classes [B.btn, B.btnPrimary]
, A.disabled busy
, A.onclick (\_ -> pure (handler code))
] [ H.text "Compile" ]
后:
H.a [ A.classes [B.btn, B.btnPrimary]
, A.href "#compile"
, A.disabled busy
, A.onclick (\_ -> E.preventDefault $> pure (handler code))
] [ H.text "Compile" ]
(完整差异可用 here )
我最终遇到了这种类型的错误:
Cannot unify type
Example.Ajax.Input
with type
Halogen.HTML.Events.Monad.Event Halogen.HalogenEffects<(http ::
Example.Ajax.HTTP | u32519)> Example.Ajax.Input
在这一点上,我对是否需要调整 UI 函数的类型签名或以错误的方式应用
preventDefault
修饰符有点迷茫。 最佳答案
$>
的类型如下所示:
($>) :: forall a. EventHandler a -> b -> EventHandler b
pure
的类型如下所示:pure :: forall a. a -> EventHandler a
所以问题是通过同时使用两者,你正在制作一个看起来像这样的类型:
EventHandler a -> EventHandler b -> EventHandler (EventHandler b)
但是你不想那样,你只需要一个
EventHandler b
,其中 b
是 E.Event
的 handler code
类型。最好的解决方案是不使用
pure
:E.preventDefault $> handler code
如果有时您确实有两个
EventHandler
值要像这样一起使用,则要使用的函数是 *>
而不是 $>
。关于purescript - 如何在 purescript-halogen 中结合有效的事件处理程序和自定义 EventUpdates?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29729517/