我正在使用Express.js(在Node.js上),并且我知道您可以通过“ locals”参数使用自定义数据呈现视图。(res.render("template", { locals: { foo: "bar" } });)
res.render("template", { locals: { foo: "bar" } });
有什么办法可以拥有“全局变量”吗?(即每个视图均可访问的数据)
我看到了view options,但这不是递归的,因此,如果我在模板中使用任何本地语言,它将替换我设置的本地语言。
view options
这是我的用例:我想这样做,以便可以每页添加CSS / JS文件,这是我的主要布局的一部分。问题是,如果我没有在每个渲染器上显式设置这些数组,则会收到未定义的错误,因此在我的模板中,我总是必须typeof css !== "undefined"跳舞。此外,我还有其他选择框选项列表,不需要将其显式添加到每个表单中。
typeof css !== "undefined"
对于自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
如果您需要访问请求对象以提取信息,则可以编写一个简单的中间件函数并使用app.settings变量。
例如,如果您使用connect-flash向用户提供消息,则可以执行以下操作:
app.use(function(req, res, next) { app.set('error', req.flash('error')); next(); });
这将使您可以使用模板中的= settings.error访问错误消息。
这些主题在这里进行了介绍,尽管内容简短:http : //expressjs.com/api.html#app.locals
app.locals 现在是一个简单的JavaScript对象,因此每个属性都必须一个一个地设置。
app.locals
app.locals.version = 3; app.locals.somefunction = function() { return "function result"; }
res.locals提供了完全相同的功能,只是应将其用于特定于请求的数据而不是应用程序范围的数据。用户对象或设置是常见的用例。
res.locals
res.locals.user = req.isAuthenticated() ? req.user : null; res.locals.userSettings = { backgroundColor: 'fff' }