视图
视图即模版,默认的根目录为 view/。
视图文件
视图文件默认的规则为 模块/控制器_操作.html。
假如 URL home/article/detail 解析后的模块是 home,控制器是 article,操作是 detail,那么对应的视图文件为 home/article_detail.html。
视图配置
视图默认配置如下,可以在配置文件 src/common/config/view.js 中修改:
export default {
content_type: "text/html", //输出模版时发送的 Content-Type
file_ext: ".html", //文件的扩展名
file_depr: "_", //控制器和操作之间的连接符
root_path: think.ROOT_PATH + "/view", //视图文件的根目录
type: "ejs", //模版引擎
options: {} //模版引擎需要的配置项
};
注: 视图默认根目录在 view/。如果想每个模块有独立的视图目录,将配置 root_path 修改为空即可。
修改连接符
默认控制器和操作之间的连接符是 _,文件名类似为 index_index.html,如果想将控制器作为一层目录的话,可以将连接符修改为 /。
export default {
file_depr: "/"
}
模版引擎
ThinkJS 默认支持的模版引擎有:ejs,jade,swig 和 nunjucks,默认模版引擎为 ejs,可以根据需要修改为其他的模版引擎。
ejs
定界符
ejs 默认的定界符是 <% 和 %>。如果想修改定界符,可以通过配置里的 options 来修改,如:
export default {
options: {
delimiter: "&" //将定界符修改为 <& 和 &>
}
}
变量输出
- 转义输出
<%= data.name%> - 不转义输出
<%- data.name%> - 注释
<%# data.name%>
条件判断
<%if(data.name === "1"){%>
<p>...</p>
<%}else if(data.name === "2"){%>
<p>...</p>
<%}else{%>
<p>...</p>
<%}%>
循环
<%list.forEach(function(item)){%>
<li><%=item.name%></li>
<%}%>
引用文件
ejs 不支持模版继承。但可以将公用的模版独立成一个文件,然后通过 include 来引入。
<%include inc/header.html%>
注: ejs 模版使用的变量需要在控制器中赋值,否则会报错。
更多 ejs 使用文档请见 这里。
nunjucks
nunjucks 是一款类似于 jinja2 的模版引擎,功能异常强大,复杂项目建议使用该模版引擎。
定界符
块级定界符为 {% 和 %},变量定界符为 {{ 和 }},注释定界符为 <# 和 #>。如:
{{ username }}
{% block header %}
This is the default content
{% endblock %}
变量输出
可以通过 {{ username }} 来输出变量,默认输出的变量会自动转义,如果不想被转义,可以通过 {{ username | safe }} 来处理。
模版继承
父级模版:
{% block header %}
This is the default content
{% endblock %}
<section class="left">
{% block left %}{% endblock %}
</section>
<section class="right">
{% block right %}
This is more content
{% endblock %}
</section>
子级模版:
{% extends "parent.html" %}
{% block left %}
This is the left side!
{% endblock %}
{% block right %}
This is the right side!
{% endblock %}
条件判断
{% if hungry %}
I am hungry
{% elif tired %}
I am tired
{% else %}
I am good!
{% endif %}
循环
<h1>Posts</h1>
<ul>
{% for item in items %}
<li>{{ item.title }}</li>
{% else %}
<li>This would display if the "item" collection were empty</li>
{% endfor %}
</ul>
具体使用文档请见 这里。
jade
jade 模版使用方式请见 这里。
swig
swig 模版使用方式请见 这里。
扩展模版引擎
模版引擎使用 Adapter 实现。如果项目里需要使用其他模版引擎,可以通过 Adapter 进行扩展,具体请见 这里。
变量赋值
控制器中可以通过 assign 方法进行变量赋值。
赋值单个变量
export default class extends think.controlle.base {
indexAction(){
this.assign("title", "ThinkJS 官网");
}
}
赋值多个变量
export default class extends think.controlle.base {
indexAction(){
this.assign({
title: "ThinkJS 官网",
author: "thinkjs"
});
}
}
获取赋值
变量赋值后也可以通过 assign 来获取赋过的值。如:
export default class extends think.controlle.base {
indexAction(){
this.assign("title", "ThinkJS 官网");
let title = this.assign("title");
}
}
模版渲染
可以通过 display 方法进行模版渲染。如果不传具体的模版文件路径,会自动查找。如:
export default class extends think.controller.base {
indexAction(){
this.display();// render home/index_index.html
}
}
也可以指定具体的模版文件进行渲染,关于 display 方法的详细使用请见 这里。
获取渲染后的内容
如果有时候不想支持输出模版,而是想获取渲染后的模版内容,那么可以通过 fetch 方法来获取。
ES6 方式
export default class extends think.controller.base {
* indexAction(){
let content = yield this.fetch();
...
}
}
动态创建类的方式
module.exports = think.controller({
indexAction: function(){
this.fetch().then(function(content){
...
})
}
})
关于 fetch 方法的详细使用方式请见 这里。
国际化
启动国际化后,视图路径会多一层国际化的目录。如:具体的视图路径变为 view/zh-CN/home/index_index.html,其中 zh-CN 为语言名。
关于如果使用国际化请见 扩展功能 -> 国际化。
多主题
设置多主题后,视图路径会多一层多主题的目录。如:具体的视图路径变为view/default/home/index_index.html,其中 default 为主题名称。
可以通过 http.theme 方法来设置当前的主题,设置主题一般是通过 middleware 来实现。
关于 middleware 更多信息请见 扩展功能 - Middleware。
默认模版变量
为了可以在模版里很方便的获取一些通用的变量,框架自动向模版里注册了 http, controller, config 等变量,这些变量可以在模版里直接使用。
下面的代码示例都是基于 ejs 模版引擎的,其他的模版引擎下需要根据相应的语法进行修改。
http
模版里可以直接使用 http 对象下的属性和方法。
controller
模版里可以直接使用 controller 对象下的属性和方法。
export default class extends think.controller.base {
indexAction(){
this.navType = "home";
}
}
Action 里给当前控制器添加了属性 navType,那么模版里就可以直接通过 controller.navType 来使用。
<%if(controller.navType === "home")%>
<li className="action">home</li>
<%}else{%>
<li>home</li>
<%}%>
config
通过 config 对象可以在模版中直接对应的配置,如:
<%if(config.name === "text"){%>
<%}%>
国际化方法 _
在模版中可以直接通过 _ 方法获取对应本地化的值,这些值在 src/common/config/locales/[lang].js 中定义。
<%= _("title")%>
更多国际化相关的信息请见 这里。