Dom*_*nes 44 javascript node.js express
我正在使用Express.js(在Node.js上),我知道您可以通过"locals"参数使用自定义数据渲染视图.(res.render("template", { locals: { foo: "bar" } });)
有没有办法拥有"全局"?(即每个视图都可访问的数据)
我看到了view options,但这不是递归的,所以如果我在模板中使用任何locals,它会替换我设置的locals.
这是我的用例:我想这样做,以便可以在每页的基础上添加CSS/JS文件,这是我的主要布局的一部分.问题是,如果我没有在每个渲染上显式设置这些数组,我会得到一个未定义的错误,所以在我的模板中我总是要typeof css !== "undefined"跳舞.此外,我还有其他选择框选项列表,我不希望显式添加到我的每个表单.
tig*_*nch 57
对于那些自Express 3发布以来可能遇到过这个问题的人来说,值得注意的是,'dynamicHelpers'方法不再存在.
相反,您可以使用app.locals函数,该函数充当您可以存储值或函数的对象,然后使它们可用于视图.例如:-
// In your app.js etc.
app.locals.title = "My App";
app.locals({
version: 3,
somefunction: function() {
return "function result";
}
});
// Then in your templates (shown here using a jade template)
=title
=version
=somefunction()
// Will output
My App
3
function result
Run Code Online (Sandbox Code Playgroud)
如果您需要访问请求对象以从中提取信息,您可以编写一个简单的中间件函数并使用app.settings变量.
例如,如果您使用connect-flash向用户提供消息,则可能会执行以下操作:
app.use(function(req, res, next) {
app.set('error', req.flash('error'));
next();
});
Run Code Online (Sandbox Code Playgroud)
这将使您在模板中使用= settings.error访问错误消息.
这里讨论了这些主题,尽管有些简短:http://expressjs.com/api.html#app.locals
app.locals 现在是一个简单的JavaScript对象,因此必须逐个设置每个属性.
app.locals.version = 3;
app.locals.somefunction = function() {
return "function result";
}
Run Code Online (Sandbox Code Playgroud)
res.locals提供完全相同的功能,但它应该用于特定于请求的数据而不是应用程序范围的数据.用户对象或设置是常见用例.
res.locals.user = req.isAuthenticated() ? req.user : null;
res.locals.userSettings = {
backgroundColor: 'fff'
}
Run Code Online (Sandbox Code Playgroud)
ale*_*lex 10
有一种方法可以使用动态视图助手为视图创建"全局"变量.
从Express.js指南:
app.dynamicHelpers(OBJ)
注册动态视图助手.动态视图助手只是接受req,res的函数,并在呈现视图之前针对Server实例进行评估.此函数的返回值将成为与其关联的局部变量.
app.dynamicHelpers({session:function(req,res){return req.session;}});
所有视图现在都有可用的会话,以便可以通过session.name等访问会话数据:
你可以在这里找到一个关于如何使用它们的真实例子:https://github.com/alessioalex/Nodetuts/tree/master/express_samples(node app.js来启动应用程序)
作为作者提到的使用视图选项的真实示例:
var app = express.createServer();
app.configure(function() {
app.set('views', path.join(__dirname, '..', 'views'));
app.set('view engine', 'jade');
app.set('view options', {
assetVersion: 1
});
Run Code Online (Sandbox Code Playgroud)
然后在我的layout.jade(在我的情况下为应用程序的基本模板):
link(rel='stylesheet', href='/static/css/' + assetVersion + '/style.css')
script(src='/static/js/' + assetVersion + '/script.js')
Run Code Online (Sandbox Code Playgroud)
有了这个小技巧,我只需要更新assetVersion变量一个地方,以确保我的资产不会在Varnish或其他地方缓存.