【问题标题】:SailsJS proper way to pass an object/variable to a layout viewSailsJS 将对象/变量传递给布局视图的正确方法
【发布时间】:2014-05-30 05:12:49
【问题描述】:

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

这就是我目前正在做的事情,并且有效

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

但是在每个动作上我都必须定义“myvar”,这样我就可以在布局级别使用它,所以我想知道是否有某种控制器或动作用于布局,以便我可以在那里放置我的逻辑?

【问题讨论】:

    标签: javascript node.js express sails.js


    【解决方案1】:

    实际上从 Sails v0.10-rc5 开始,您可以使用sails.config.views.locals hash 指定默认情况下应提供给所有视图的变量。所以在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 变量。

    【讨论】:

    • 清晰且写得很好的答案。您应该将其提交给 Sails 文档。
    • 请注意,策略不适用于没有控制器的路由!问题:github.com/balderdashy/sails/issues/3122.
    • 策略适用于控制器操作的记录非常充分。 /config/policies.js 文件仅涉及控制器和操作——没有任何地方表明它适用于裸路由。话虽如此,如果您使用policy target syntax,则可以将策略直接应用于config/routes.js 文件中的路由。
    【解决方案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?

    【讨论】:

    • 谢谢!应该这样做:)
    【解决方案3】:

    您可以使用 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 中设置的某些变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 2016-11-20
      • 2011-04-01
      • 1970-01-01
      • 2015-01-04
      相关资源
      最近更新 更多