首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不带hamlet的一元yesod形式的创建

不带hamlet的一元yesod形式的创建
EN

Stack Overflow用户
提问于 2016-08-11 05:58:47
回答 1查看 89关注 0票数 1

我的目标是编写一个不使用hamlet的一元yesod形式。

假设我有这样的示例形式:

代码语言:javascript
复制
userForm :: Maybe User -> Html -> MForm Handler (FormResult User, Widget)
userForm u extra = do
  (nameR, nameV) <- mreq textField "" (userName <$> u)
  (passR, passV) <- mreq passwordField "" Nothing
  let userRes = User <$> nameR <*> passR
  let widget = do
    toWidget $ \render -> do
      extra
      -- fvInput nameV?
      -- fvInput passV?
      H.input ! type_ "submit" ! value "Submit"
  return (userRes, widget)

在使用hamlet的情况下,它将如下所示:

代码语言:javascript
复制
let widget = do
  toWidget [whamlet|
            ^{fvInput nameV}
            ^{fvInput passV}
           |]

但fvInput的返回类型是FieldView App,我需要将其转换为Html,以便很好地与blaze组合。

也许,使用Input Form来完成这项任务会更容易(例如,在没有w/hamlet的情况下实现表单),但是yesodbook上的文档说它没有正确处理错误的输入大小写。我在这里倾向于使用一元表单,因为我想在这里“免费”重新创建用户输入,以防验证失败。它会这样工作吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-11 07:10:45

widgetToPageContent中使用lift

代码语言:javascript
复制
userForm :: Maybe MyUser -> Html -> MForm Handler (FormResult MyUser, Widget)
userForm u extra = do
  (nameR, nameV) <- mreq textField "" (myUserName <$> u)
  (passR, passV) <- mreq passwordField "" Nothing
  nameContents <- lift $ widgetToPageContent (fvInput nameV)
  passContents <- lift $ widgetToPageContent (fvInput passV)
  let userRes = MyUser <$> nameR <*> passR
  let widget = do
        toWidget $ \render -> do
          extra
          pageBody nameContents render
          pageBody passContents render
          H.input H.! A.type_ "submit" H.! A.value "Submit"
  return (userRes, widget)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38884259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档