5

我有一个带有标题、菜单、内容和页脚的简单页面。我需要将它们分成单独的文件。在阅读了 express 文档后,我(创建了 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);
    });
});

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

4

1 回答 1

5

您怀疑缺少某些东西是正确的,您在那里做了不必要的工作。

Express 将为您将模板拼接在一起,只需调用 res.render() 和您要调用的视图的名称。布局和局部应该被自动拉入。

在我的应用程序中,我通常使用如下部分。只需用您使用的任何模板引擎(Jade、moustache 等)替换对 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);
});

./views/layout.ejs

<html>
    <head><%- partial('partials/head') %></head>
    <body>
<%- partial('partials/menu') %>
<%- body %>
<%- partial('partials/footer') %>
    </body>
</html>

./views/index.ejs

<h1>Index page</h1>

./views/partials/menu.ejs

<div><a href='... </div>

./views/partials/head.ejs

<script>...</script>
etc.
于 2011-09-07T10:07:12.963 回答