如何将模板中的内容传递到Express中的布局?

Jam*_*sen 11 javascript node.js pug

我有一个基本的Express服务器:

// server.js:
var Express = require('express');
app = Express.createServer();
app.configure(function(){
  app.set('views', Path.join(__dirname, 'views'));
  app.set('view engine', 'jade');
  app.set('view options');
});
app.get('/', function (request, response) {
  response.render('welcome', {
    locals: {some: 'Locals'}
  });
});
Run Code Online (Sandbox Code Playgroud)

基本的玉石布局:

// views/layout.jade:
!!! 5
html(lang='en')
  head
    title= pageTitle
  body
    h1= pageTitle
    aside(id="sidebar")= sidebarContent
    #content
      #{body}
Run Code Online (Sandbox Code Playgroud)

一个简单的页面:

# views/welcome.jade:
// How do I pass pageTitle and sidebarContent out to the layout from here?
p
  Welcome to my fine site!
Run Code Online (Sandbox Code Playgroud)

(在Rails中,这可能是类似的content_for或简单的实例变量.)

Jak*_*ake 19

使用上面关于dynamicHelpers的提示和闭包的魔力,我发现了一个相当优雅的解决方案,它可以在不涉及请求对象的情况下工作.诀窍是将页面标题变量包装在一个闭包中,该闭包提供围绕它的get()和set()函数,并使该包装器对象成为page_title动态帮助器的结果.

创建property.js:

exports.create = function () {
    var value = null;
    return {
        get: function () {
           return value;
        },
        set: function (new_value) {
           value = new_value;
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

所以调用create()会返回一个带有get()和set()方法的对象,它获取并设置闭包变量.

然后,在您的应用的设置代码中:

    var property = require("./property.js");
    app.dynamicHelpers ({
        page_title: function () {
         return property.create ();
        }
    });
Run Code Online (Sandbox Code Playgroud)

由于动态助手的值是调用其函数的结果,因此在视图和模板中,page_title变量将是包含get()和set()函数的包装器对象.

在您看来,您可以说:

- page_title.set ("my specific page title");
Run Code Online (Sandbox Code Playgroud)

在你的布局中:

title= page_title.get()
Run Code Online (Sandbox Code Playgroud)

为了进一步简化这一点,将其添加到property.js:

exports.creator = function () {
    return function () {
        return exports.create();
    };
}
Run Code Online (Sandbox Code Playgroud)

允许您将动态助手声明块简化为:

        var property = require("./property.js");
        app.dynamicHelpers ({
            page_title: property.creator()
        });
Run Code Online (Sandbox Code Playgroud)


tjh*_*huk 5

Express没有一个先入为主的"块"概念或者他们在rails中所称的任何东西,但你可以使用helpers()和dynamicHelpers()的组合来实现类似http://expressjs.com/guide.html# APP-佣工,obj-

传递的本地可用于布局和页面视图