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

时间:2014-04-15 17:34:37

标签: javascript node.js express sails.js

您好我想知道是否有正确的方法将变量或对象传递给布局视图?

这就是我现在正在做的事情,它可以正常工作

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

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

3 个答案:

答案 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中设置的某个变量。