关于偏见的新手问题

时间:2011-09-06 09:00:21

标签: node.js express ejs

我有一个简单的页面,包含头部,菜单,内容和页脚。我需要将它们分成单独的文件。阅读快速文档后,我(创建了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);
    });
});

虽然它有效但对我来说似乎有点脏。有没有更好的方法来使用部分模板?

1 个答案:

答案 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.