问问题
112 次
2 回答
3
想通了:有一个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| … |]
(并postTitle
在 Web/Controller/Posts.hs 中设置),然后将 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>
|]
于 2020-10-10T15:30:29.223 回答
1
现在有一个pageTitle
你可以在视图中使用的函数(例如你的布局),如下所示:
[hsx|
<head>
<title>{pageTitle}</title>
</head>
|]
反过来可以使用setTitle
action ShowProjectAction { projectId } = do
project <- fetch projectId
setTitle (get #title project)
最新的 IHP 还生成以下布局,您可以通过后备自动获得它:
defaultLayout :: Html -> Html
defaultLayout inner = H.docTypeHtml ! A.lang "en" $ [hsx|
<head>
{metaTags}
{stylesheets}
{scripts}
<title>{pageTitleOrDefault "App"}</title>
</head>
<body>
<div class="container mt-4">
{renderFlashMessages}
{inner}
</div>
</body>
|]
于 2021-09-12T18:37:16.523 回答