Skip to content
On this page

模板中的layout

layout 在服务器端模板中是非常重要的概念(前端模板很少会用),指的是页面的结构布局抽离,比如每个页面的head部分都是一样的,页尾也是一样的,这时候我们就可以定义个 layout (layout也是.xtpl模板),每个页面都继承于这个layout。

定义个 layout

在 view 目录下创建 layout 目录,放个 default.xtpl ,内容如下:

html
<!doctype html>
<html>
<head>
    <meta name="charset" content="utf-8" />
    <title>{{title}}</title>
    <script src="http://cdn.staticfile.org/jquery/2.1.1-rc2/jquery.min.js"></script>
    <script src="http://cdn.staticfile.org/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
    <link rel="stylesheet" href="http://cdn.staticfile.org/twitter-bootstrap/3.3.1/css/bootstrap-theme.min.css">
    {{{block ("head")}}}
</head>
<body>
{{{block ("body")}}}
</body>
</html>

可以看到,我们将页面基础结构抽离出来了,留意 block ("head") ,block 是xtemplate指令,用于继承于 layout 的页面覆盖 layout 中的 block 占位。

三个刮号 表示支持html变量,防止转译。)

假设 test.xtpl 继承于 layout/default.xtpl :

html
{{extend ("./layout/layout")}}
    
    {{#block ("head")}}
        <style>
    
        </style>
    {{/block}}
    
    {{#block ("body")}}
    <p>这是个 koa 的测试页面</p>
    {{/block}}

使用 extend() 指令可以继承于指定的xtpl模块(被继承的模板就是 layout)。

html
{{#block ("head")}}
     <style>
    
     </style>
    {{/block}}

block 块状指令用于定义 block 占位的 html 内容,这样我们就可以在通用的 layout,定制页面的业务html内容。

xtemplate的指令分为行内指令与块状指令,比如 block("") 就是行内指令,而 {{#block("")}} 是块状指令,以 **#**开头,并需要{{/block}}结束标识。

最后页面的渲染结果是:

html
<!doctype html>
<html>
<head>
    <meta name="charset" content="utf-8" />
    <title></title>
    <script src="http://cdn.staticfile.org/jquery/2.1.1-rc2/jquery.min.js"></script>
    <script src="http://cdn.staticfile.org/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
    <link rel="stylesheet" href="http://cdn.staticfile.org/twitter-bootstrap/3.3.1/css/bootstrap-theme.min.css">
    <style>

    </style>
</head>
<body>
<p>这是个 koa 的测试页面</p>
</body>
</html>

被继承的 layout 共享页面的上下文数据,比如 layout 有个占位变量 {{title}},页面渲染时 this 上下文存在 title,依旧可以正常替换。