***图1-3 模板引擎在MVC中的位置***
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
```nodejs routes/index.js片段
res.render('index', { title: 'Express' });
```
res.render 的功能是调用模板引擎,并将其产生的页面直接返回给客户端。它接受两个参数,第一个是模板的名称,即 views 目录下的模板文件名,不包含文件的扩展名;第二个参数是传递给模板的数据,用于模板翻译。
```ejs index.ejs
<h1><%= title %>h1>
Welcome to <%= title %>
```
上面代码其中有两处 <%= title %>,用于模板变量显示,它们在模板翻译时会被替换成 Express,因为 res.render 传递了 { title: 'Express' }。
```nodejs app.js片段
app.set('view options', {
layout: false
});
```
Layout是默认的装饰页面,还可以通过如下代码指定装饰的页面。
```nodejs index.js片段
function(req, res) {
res.render('userlist', {
title: '用户列表后台管理系统',
layout: 'admin'
});
};
```
这样就会自动套用admin.ejs来装饰了。
```nodejs app.js片段
app.get('/userlist',routes.userlist);
```
```nodejs routes/index.js片段
exports.userlist = function(req, res) {
res.render('list',{
title:'List',
items:[1988,'David','birthday','HelloWorld']
});
};
```
partial 是一个可以在视图中使用函数,它接受两个参数,第一个是片段视图的名称,第二个可以是一个对象或一个数组,如果是一个对象,那么片段视图中上下文变量引用的就是这个对象;如果是一个数组,那么其中每个元素依次被迭代应用到片段视图。片段视图中上下文变量名就是视图文件名,例如上面的'listitem'。
```ejs views/list.ejs
[list]<%- partial('listitem', items) %>[/list]
```
```ejs views/listitem.ejs
[*]<%= listitem %>
```
运行结果:
```nodejs app.js
……
var util = require('util');
var partials = require('express-partials');
……
// helpers
app.locals({
inspect: function(obj) {
return util.inspect(obj, true);
}
});
// dynamicHelpers
app.use(function(req,res,next){
res.locals.headers= req.headers;
res.locals.dyvar = "This is a dynamic var!";
next();
});
app.use(app.router);
……
app.get('/helper',routes.helper);
……
```
开始要先引入util模块,因为测试方法需要用到。
```nodejs routes/index.js片段
exports.helper = function(req, res) {
res.render('helper', {
title: 'Helpers'
});
```
```ejs views/helper.ejs
<%= locals.dyvar %>
<%=inspect(locals.headers)%>
```
注意:在页面中应用一定要记得要locals.headers