【问题标题】:Newbie questions about partials关于部分的新手问题
【发布时间】:2011-11-11 03:42:19
【问题描述】:

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

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

【问题讨论】:

    标签: node.js express ejs


    【解决方案1】:

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

    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.
    

    【讨论】:

    • 啊哈,有些问题。部分功能是否以同步方式执行?可以从任何部分模板访问“foo”变量吗?以及如何将变量传递给部分视图(只能使用集合或多个变量)?
    • 我认为同步程度取决于模板引擎。 Express 在生产环境中使用模板缓存,因此性能非常好。您可以像 res.render() 一样将变量传递给局部变量,即。部分('名称',{locals:{foo:'bar'}})
    • 顺便说一句,是否部分返回“文本/纯”数据?有什么办法可以改变这种行为?
    • 不确定你在问什么。 Partial 返回部分模板输出的任何文本(这就是为什么您需要未转义的 代码块来正确呈现部分)。你想完成什么?
    • 似乎又是一个错误:stackoverflow.com/questions/7415641/…
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    相关资源
    最近更新 更多