【发布时间】:2016-08-10 14:17:39
【问题描述】:
我正在尝试编写一个没有任何小村庄部分的 yesod 应用程序。我的问题是关于表单的:我可以使用 Applicative 生成表单,但我不能直接在我的 blaze 代码中使用它。
这里是一个小村庄版本的例子:
-- actual form example
userForm :: Form User
userForm = renderDivs $ User
<$> areq textField "Login" Nothing
-- usage example
getPageR :: Handler Html
getPageR = do
((_, widget), enctype') <- runFormGet userForm
defaultLayout [whamlet|
<form method=post action=@{PageR} enctype=#{enctype'}>
^{widget} -- This widget include.
<button>Submit|]
但是如果没有 hamlet,我怎么能重写它呢?我现在的代码是这样的:
getPageR = do
((_, widget), enctype') <- runFormGet userForm
defaultLayout $ do
toWidgetBody $ \render -> do
H.div ! A.id "form" $ do
H.form ! A.method "post" ! A.action (action' render) ! A.enctype (enct' enctype) $ ""
-- widget include?
H.button "Submit!"
where
action' = \render -> toValue $! render (PageR) []
enct' = toValue . renderHtml . toHtml
很明显,blaze代码的类型是Html,而userForm类型是Widget,所以无法连接。我只能在toWidgetBody 函数之后添加小部件,但随后表单将是所有内容。有没有办法在没有 hamlet ^{widget} 构造的情况下在 blaze 组合器中包含表单(通过将其渲染为 Html,也许?)?
【问题讨论】: