您好我想知道是否有正确的方法将变量或对象传递给布局视图?
这就是我现在正在做的事情,它可以正常工作
index: function(req, res){
res.view({ layout: 'mylayout', myvar: 'This is a view var' });
}
但在我必须定义的每一个动作中,myvar'所以我可以在布局层面使用它,所以我想知道是否有某种控制器或布局动作,所以我可以放置我的逻辑?
答案 0 :(得分:19)
实际上从Sails v0.10-rc5开始,您可以使用sails.config.views.locals
哈希来指定默认情况下应该为所有视图提供的变量。所以在config/views.js
中,例如:
{
locals: {
myvar : 'this is a view var'
}
}
会将var添加到每个视图中。这对影响视图引擎的变量非常有用;有关详细信息,请参阅here。
您还可以使用Sails v0.10.x中的policy通过更改req.options.locals
来跨多个视图设置变量。因此,如果您使用以下内容创建了一个策略/api/policies/decorate.js
module.exports = function(req, res, next) {
// Default to an object if empty, or use existing locals that may have
// been set elsewhere
req.options.locals = req.options.locals || {};
// Set a new local var that will be available to any controller that
// implements the policy
req.options.locals.myVar = Math.random()
然后将/config/policies.js
设置为:
module.exports = {
'*': 'decorate'
}
然后,使用res.view
的任何控制器操作都会在视图中提供myVar
变量。
答案 1 :(得分:2)
这取决于您使用sails配置的布局引擎(默认为ejs)。但是,将变量传递给视图通常是这样做的:
index: function(req, res){
res.view({ layout: 'mylayout', myModel: modelObj });
}
您必须在使用它的每个视图中注入模型。如果要在全局注册模型,则必须使用如下所述的自定义中间件:How to create global variables accessible in all views using Express / Node.JS?
答案 2 :(得分:0)
您可以使用config.views.locals,但我喜欢将其保留在config文件夹中并将其放在api / services目录中。我称之为api / services / page.js
然后根据需要添加一些变量和其他视图助手。
module.exports = {
title:'test',
appName: 'My App Name',
getBlueprintPath: function (path) {
return sails.config.blueprints.prefix + path;
},
};
然后在我看来我有
<%= page.appName %>
这样做的好处是你的逻辑保存在api目录中。您仍然可以为视图设置本地,而不是意外地覆盖先前在config.views.local中设置的某个变量。