html – 如何独立于外部请求呈现Widget一次?

Yesod使得通过warp的端口从外部请求网页(由Widgets构建)呈现为 HTML非常简单.为什么,这当然正是我们通常需要HTML的地方.

但是,如果我还需要一个用于“内部目的”的HTML副本,它是独立于通常的Handler设置生成的呢?您认为Widget本质上只是一个读者/作者组合,阅读Yesod并编写HTML,CSS和JS结果的元组. The documentation itself说“……这只是一个作家……”.好的但是…

newtype WidgetT site m a = WidgetT
    { unWidgetT :: HandlerData site (MonadRoute m) -> m (a, GWData (Route site))
    }

handlerdatasiteroutegwdataroute …呃.

如何调用此方法并获取通常只是直接发送到客户端的结果HTML,而不实际将窗口小部件嵌入到任何处理程序中?

所以,我基本上想要

runWidget :: Widget -> MyYesod -> IO Html

             WidgetT MyYesod IO () -> MyYesod -> IO Html

我只是缺少一些能够做到这一点的功能,或者是否存在问题 – 也许小部件实际上比我想象的更强大?如果是这样,那么将HTML和CSS的Writer一起表达的正确类型是什么?

最佳答案 我怀疑,您可以先使用defaultLayout甚至widgetToPageContent和withUrlRenderer将Widget变为Handler,然后使用这个小帮手“运行”它:

handler :: Handler a -> IO a
handler h = getAppSettings >>= makeFoundation >>= flip unsafeHandler h

您也可以使用处理程序. runDB以这种方式“运行”数据库操作.

点赞