作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个基本的 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/
我是一名优秀的程序员,十分优秀!