Новичок вопросы о частичках - PullRequest
5 голосов
/ 06 сентября 2011

У меня есть простая страница с заголовком, меню, контентом и нижним колонтитулом. Мне нужно разделить их на отдельные файлы. После прочтения экспресс-документации я (создал 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 Ответ

5 голосов
/ 07 сентября 2011

Вы были правы, подозревая, что чего-то не хватает, вы выполняете ненужную работу там.

Express свяжет шаблоны для вас, просто вызовите res.render () и имя представления, которое вы хотите вызвать. Компоновка и партиалы должны быть установлены автоматически.

В своих приложениях я обычно использую партиалы, как показано ниже. Просто замените ссылки на EJS тем механизмом шаблонов, который вы используете (Jade, усы и т. Д.):

. / 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.
...