我有一个简单的页面,包含头部,菜单,内容和页脚。我需要将它们分成单独的文件。阅读快速文档后,我(创建了4个模板)写了这样的东西:
app.get('/', function(req, res) {
var response = [null, null, null, null]
, everyNotNull = function(elem) {
return (elem !== null);
}, sendResponse = function(type, str) {
switch (type) {
case 'head' : response[0] = str; break;
case 'menu' : response[1] = str; break;
case 'content' : response[2] = str; break;
case 'footer' : response[3] = str; break;
}
if (response.every(everyNotNull)) {
res.send(response.join(''));
}
};
res.partial('head', {'title' : 'page title'}, function(err, str) {
sendResponse('head', str);
});
res.partial('menu', {'active' : '/'}, function(err, str) {
sendResponse('menu', str);
});
res.partial('index', {'title' : 'Home'}, function(err, str) {
sendResponse('content', str);
});
res.partial('footer', {'nowdate' : (new Date()).getFullYear()}, function(err, str) {
sendResponse('footer', str);
});
});
虽然它有效但对我来说似乎有点脏。有没有更好的方法来使用部分模板?
答案 0 :(得分:5)
你怀疑某些事情是错的,你在那里做了不必要的工作。
Express会将模板拼接在一起,只需调用res.render()和您要调用的视图的名称。布局和部分应该自动拉入。
在我的应用中,我通常使用如下部分。只需用你正在使用的模板引擎(Jade,胡子等)替换对EJS的引用:
<强> ./ LIB / app.js 强>
app.get('/', function(req, res) {
var model = {
layout:'customLayout', // defaults to layout.(ejs|jade|whatever)
locals:{
foo:'bar'
}
};
res.render('index',model);
});
<强> ./视图/ layout.ejs 强>
<html>
<head><%- partial('partials/head') %></head>
<body>
<%- partial('partials/menu') %>
<%- body %>
<%- partial('partials/footer') %>
</body>
</html>
<强> ./视图/ index.ejs 强>
<h1>Index page</h1>
<强> ./视图/分音/ menu.ejs 强>
<div><a href='... </div>
<强> ./视图/分音/ head.ejs 强>
<script>...</script>
etc.