【发布时间】:2017-12-13 16:52:57
【问题描述】:
我有这样的布局:
@@ layouts/v2.html.ep
<html lang="en">
<head>
%= content_for 'stylesheets'
</head>
<body>
%= include 'layouts/v2/header'
<main class="main">
%= include 'layouts/v2/menu'
<div class="content">
%= content
</div>
</main>
</body>
</html>
@@ layouts/v2/menu
% content_for stylesheets => begin
%= stylesheet 'v2/css/menu.css'
% end
<aside class="menu">
...
</aside>
@@ layouts/v2/header
% content_for stylesheets => begin
%= stylesheet 'v2/css/header.css'
% end
<header class="header">
...
</header>
在这里,当包含模板时,我会包含它们的样式表。 请注意模板中的这一点:
% content_for stylesheets => begin
%= stylesheet 'v2/css/menu.css'
% end
但这已经太晚了,因为<head> 已经被渲染了。
作为解决此问题的方法,我可以将 %= content_for 'stylesheets' 从 <head> 移动到页面底部。但我希望先加载样式表。
有什么办法可以推迟渲染“样式表”块的内容,直到整个页面渲染完?
UPD
感谢@amon 关于Mojolicous layouts are rendered inside out。我理解这个问题,对于第一个 layout 中包含的模板,我手动包含样式表:
@@ layouts/v2.html.ep
<html lang="en">
<head>
%= stylesheet 'v2/css/header.css'
%= stylesheet 'v2/css/menu.css'
%= content_for 'stylesheets'
</head>
<body>
%= include 'layouts/v2/header'
<main class="main">
%= include 'layouts/v2/menu'
<div class="content">
%= content
</div>
</main>
</body>
</html>
因此,在任何渲染/包含的模板(布局除外)中,下一个都可以正常工作:
@@ some/template
% content_for stylesheets => begin
%= stylesheet 'some/template.css'
% end
template content
【问题讨论】:
-
与 TT 一起使用的方法:
some_page.tt:[% stylesheet = ... %][% WRAPPER wrapper.tt %]...[% END %]和wrapper.tt:<head>[% stylesheet %]</head>[% content %]。 Mojolicious 有某种包装指令吗? -
@ikegami:好像是
layout辅助命令
标签: perl mojolicious