node.js Web应用框架Express入门指南(6)


app.get('https://www.jb51.net/', function(req, res){
    res.render('index.jade', { title: 'My Site' });
});


新的 view engine 设置允许我们指定默认的模板引擎,例如当我们使用 jade 时可以这样设置:

复制代码 代码如下:


app.set('view engine', 'jade');


允许我们这样处理:

复制代码 代码如下:


res.render('index');


对应于:

复制代码 代码如下:


res.render('index.jade');


当 view engine 被设定,扩展名实属可选,但我们依然可以混着匹配模板引擎:

复制代码 代码如下:


res.render('another-page.ejs');


Express 同时还提供了 view options 设置,这将应用于一个 view 每次被渲染的时候,譬如你不希望使用 layouts 的时候可能会这样做:

复制代码 代码如下:


app.set('view options', {
    layout: false
});


在需要的时候,这可以在 res.render() 调用的内部进行重载:

复制代码 代码如下:


res.render('myview.ejs', { layout: true });


当有需要变更一个 layout,我们通常需要再指定一个路径。譬如当我们已经把 view engine 设置为 jade,并且这个文件命名为 ./views/mylayout.jade,我们可以这样简单地进行传参:

复制代码 代码如下:


res.render('page', { layout: 'mylayout' });


否则(译注:没有把 view engine 设置为 jade 或者其他的引擎时),我们必须指定一个扩展名:

复制代码 代码如下:


res.render('page', { layout: 'mylayout.jade' });


它们同样可以是绝对路径:

复制代码 代码如下:


res.render('page', { layout: __dirname + '/../../mylayout.jade' });


对于这点有一个不错的例子 —— 自定义 ejs 的起始和闭合标签:

复制代码 代码如下:


app.set('view options', {
    open: '{{',
    close: '}}'
})

十五、View 部件

Express 的 view 系统内置了部件(partials) 和集合器(collections)的支持,相当于用一个 “迷你” 的 view 替换一个文档碎片(document fragment)。示例,在一个 view 中重复渲染来显示评论,我们可以使用部件集:

复制代码 代码如下:


partial('comment', { collection: comments });


如果并不需要其他选项或者本地变量,我们可以省略整个对象,简单地传进一个数组,这与上述是等价的:

复制代码 代码如下:


partial('comment', comments);


在使用中,部件集无偿地提供了一些 “神奇” 本地变量的支持:

1.firstInCollection true,当它是第一个对象的时候
2.indexInCollection 在集合器对象中的索引
3.lastInCollection true,当它是最后一个对象的时候
4.collectionLength 集合器对象的长度

本地变量的传递(生成)具备更高的优先级,同时,传到父级 view 的本地变量对于子级 view 同样适应。例如当我们用 partial('blog/post', post) 来渲染一个博客文章,它将会生成一个 post 本地变量,在调用这个函数的 view 中存在本地变量 user,它将同样对 blog/post 有效。(译注:这里 partial 比较像 php 中的 include 方法)。

注意: 请谨慎使用部件集合器,渲染一个长度为 100 的部件集合数组相当于我们需要处理 100 个 view。对于简单的集合,最好重复内置,而非使用部件集合器以避免开销过大。

十六、View 查找

View 查找相对于父级 view (路径)执行,如我们有一个 view 页面叫作 views/user/list.jade,并且在其内部写有 partial('edit') 则它会尝试加载 views/user/edit.jade,同理 partial('../messages') 将会加载 views/messages.jade。

View 系统还支持模板索引,允许你使用一个与 view 同名的目录。例如在一个路由中,res.render('users') 得到的非 views/users.jade 即 views/users/index.jade。(译注:先处理 <path>.<engine> 的情况,再处理 <path>/<index.<engine> 的情况,详情可见 view.js。)

当使用上述 view 索引,我们在与 view 同一个目录下,使用 partial('users') 中引用 views/users/index.jade,与此同时 view 系统会尝试索引 ../users/index,而无须我们调用 partial('users')。

十七、Template Engines

下列为 Express 最常用的模板引擎:

1.Haml:haml 实现
2.Jade:haml.js 继位者
3.EJS:嵌入式 JavaScript
4.CoffeeKup:基于 CoffeeScript 的模板
5.jQuery Templates

十八、Session 支持

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgpfww.html