SailsJS将对象/variables传递给布局视图的正确方法

你好,我想知道是否有一个正确的方法来传递一个variables或对象到布局视图?

这就是我现在正在做的,它的工作原理

index: function(req, res){ res.view({ layout: 'mylayout', myvar: 'This is a view var' }); } 

但是在每个动作中,我必须定义'myvar',所以我可以在布局级别使用它,所以我想知道是否有某种控制器或布局的动作,所以我可以在那里放置我的逻辑?

实际上从Sails v0.10-rc5开始,你可以使用sails.config.views.locals hash来指定应该默认提供给所有视图的variables。 所以在config/views.js ,像这样:

 { locals: { myvar : 'this is a view var' } } 

会将var添加到每个视图。 这对影响视图引擎的variables最为有用; 在这里看到更多的细节。

您也可以在Sails v0.10.x中使用策略 ,通过修改req.options.locals来在多个视图中设置variables。 所以如果你创build了一个/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控制器动作都会在视图中使用myVarvariables。

这取决于你用sailsconfiguration的布局引擎(ejs是默认的)。 然而,传递variables到视图通常是这样做的:

 index: function(req, res){ res.view({ layout: 'mylayout', myModel: modelObj }); } 

您必须在使用它的每个视图中注入模型。 如果您想要在全局范围内注册模型,您必须使用如下所述的自定义中间件: 如何使用Express / Node.JS创build在所有视图中可访问的全局variables?

你可以使用config.views.locals,但我想保持这个config文件夹,并把它放在api / services目录中。 我把它叫做api / services / page.js

然后添加一些variables和其他视图助手,如果你想。

 module.exports = { title:'test', appName: 'My App Name', getBlueprintPath: function (path) { return sails.config.blueprints.prefix + path; }, }; 

那么我认为我有

 <%= page.appName %> 

这样做的好处是你的逻辑保存在api目录里面。 你仍然可以设置视图的本地人,而不是无意中覆盖你以前在config.views.local中设置的一些variables。