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

标签 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'}
  });
});

有一个基本的 Jade 布局:

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

还有一个简单的页面:

# views/welcome.jade:
// How do I pass pageTitle and sidebarContent out to the layout from here?
p
  Welcome to my fine site!

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

最佳答案

使用上面关于 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;
        }
    };
}

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

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

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

由于动态帮助器的值是调用其函数的结果,因此在您的 View 和模板中,page_title 变量将是带有 get() 和 set() 函数的包装器对象。

在你看来,你可以说:

- page_title.set ("my specific page title");

在你的布局中:

title= page_title.get()

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

exports.creator = function () {
    return function () {
        return exports.create();
    };
}

让您将动态助手声明 block 简化为:

        var property = require("./property.js");
        app.dynamicHelpers ({
            page_title: property.creator()
        });

关于javascript - 如何将模板中的内容传递到 Express 中的布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3601080/

相关文章:

javascript - 如何在onclick函数jquery中传递两个参数

node.js - 如何动态更改通过docker运行的 Node 项目中的内容

node.js - 无法在字符串上创建属性 'mark'

css - 如何在 ngstyle 中正确使用 css "calc()'

javascript - 从速记条件语句中获取 bool 值

javascript - Bootstrap 模态表单不在服务器上执行 POST 方法

node.js - Docker 远程 API 和绑定(bind)

javascript - AngularJS - 获取 ng-repeated DOM 元素的数据模型

javascript - 为什么我的具有多个路径的 express router.get URL 只呈现文本?

javascript - 如何在 javascript 或 jquery 中创建动态二维数组?