我有这样的布局:
@@ 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
答案 0 :(得分:5)
从内到外渲染浮动布局,您可以任意嵌套多个布局。
创建一个模板,其中仅包含最外层文档内容和其他HTML样板文件,其中包含<body>
<html lang="en">
<head>
%= content_for 'stylesheets'
</head>
<body>
%= content
</body>
</html>
然后,您可以将该模板用作HTML页面正文的布局。即,像这样使用layout
助手:
% layout 'outermost_layout';
%= include 'layouts/v2/header'
<main class="main">
%= include 'layouts/v2/menu'
<div class="content">
%= content
</div>
</main>
渲染模板后,Mojolicious将检查您是否指定了layout
,然后使用此模板的输出作为外部布局content
进行渲染。因此,首先渲染最里面的布局,数据可以从模板通过存储流到包装布局。