gpt4 book ai didi

haskell - 如何在 Yesod 中使用 blaze 代码编写小部件?

转载 作者:行者123 更新时间:2023-12-02 01:22:52 25 4
gpt4 key购买 nike

我正在尝试编写一个没有任何 hamlet 部分的 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?)?

最佳答案

使用 widgetToPageContent功能。

然后您可以通过调用 pageBody 获得 Html并应用 render 函数。

getPageR :: Handler Html -- same as: HandlerT App IO Html
getPageR = do
((_, widget), enctype') <- runFormGet sampleForm
content <- widgetToPageContent widget
defaultLayout $ do
toWidgetBody $ \render -> do
H.div ! A.id "form" $ do
H.form ! A.method "post" ! A.action (action' render)
! A.enctype (enct' enctype') $ ""
pageBody content render
H.button "Submit!"
where
action' = \render -> toValue $! render (PageR) []
enct' = toValue . renderHtml . toHtml
(!) = (H.!)
toValue = H.toValue

关于haskell - 如何在 Yesod 中使用 blaze 代码编写小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38875994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com