问题描述
我看到<title>App</title>
硬编码在Web / View / Layout.hs的defaultLayout
中,而Web / View / Context.hs具有
let viewContext = ViewContext {
requestContext = ?requestContext,user = currentUserOrnothing,flashMessages,controllerContext = ?controllerContext,layout = let ?viewContext = viewContext in defaultLayout
}
但是如何为特定的View使用其他功能? View类的html
函数似乎没有返回新的上下文,只是部分页面的新html。
解决方法
弄清楚了:您可以在beforeRender
类中重写一个View
函数,例如,
data ShowView = ShowView { targets :: [Include "comments" Post],postTitle :: Text }
instance View ShowView ViewContext where
beforeRender (context,view) = (context { layout = myLayout (postTitle view) },view)
html ShowView { .. } = [hsx| … |]
(并在Web / Controller / Posts.hs中设置postTitle
,然后将Web / View / Layout.hs更改为
defaultLayout :: Html -> Html
defaultLayout = myLayout "App"
myLayout :: Text -> Html -> Html
myLayout title inner = H.docTypeHtml ! A.lang "en" $ [hsx|
<head>
{metaTags}
{stylesheets}
{scripts}
<title>{title}</title>
</head>
<body>
<div class="container mt-4">
{renderFlashMessages}
{inner}
</div>
</body>
|]