【问题标题】:How to use multiple layout within a SailsJS app?如何在 SailsJS 应用程序中使用多个布局?
【发布时间】:2014-01-24 16:25:57
【问题描述】:

我的 Sails.js 应用程序具有单独的 frontendadmin 布局。 我的视图引擎是ejs

如何为前端和管理站点使用不同的布局?

我可以为每个动作使用特定的布局吗?

【问题讨论】:

    标签: layout ejs sails.js


    【解决方案1】:

    来自Sails.js Documentation

    至少在 EJS 中,你必须使用 _layoutFile:

    res.view({
      _layoutFile: 'relativePathToYourCustomLayoutFromTheTargetView.ejs'
    });
    

    您要使用的布局的路径应相对于您正在呈现的视图指定。因此,如果您在 UserController 的创建操作中,渲染视图 (views/user/create.ejs),您的自定义布局的相对路径可能是:../staticSiteLayout.ejs

    PROJECT FOLDER
    └── views
        ├── staticSiteLayout.ejs
        ├── layout.ejs
        └── user
            └── create.ejs
    

    更新:

    似乎文档与代码有点偏离,因此对于当前 (v0.9.8) 版本,方法如下:

    module.exports = { 
      index: function(req, res){
        res.view({ layout: 'layoutadmin' });
      }
    }
    

    【讨论】:

    • 我尝试了这个,但似乎它不起作用。这是我的代码:module.exports = { index: function(req, res){ res.view({ _layoutFile: '../layoutadmin.ejs' }); } }
    • 它总是呈现我在 config/views.js 中定义的默认布局
    • 你能试试module.exports = { index: function(req, res){ res.view({ layout: 'layoutadmin' }); } }吗?尽管有文档,what they have in the code 似乎是管理布局的更合适的方式。
    • 它就像一个魅力!它应该在主要答案以及 SailsJS 文档上进行更新。谢谢@bredikhin 先生!
    • 感谢@bredikhin,我们将在文档中更新它。你是对的,你需要将一个本地的layout 变量设置为布局的字符串名称/路径。这在 v0.10 中也是一致的。
    【解决方案2】:

    在 Sails 0.10 中,您可以在控制器中设置不同的布局,如下所示:

    // override the layout to use another
        res.locals.layout = 'layouts/layout2';
        return res.view('test');
    

    详解here

    【讨论】:

      【解决方案3】:

      在 Sails v0.12 中,如果您需要在控制器中设置布局,您可以创建一个新文件夹(例如“layout”)并推送布局文件。

      res.view('auth/login', {layout: layout/my_file_layout}
      

      你也可以这样做:

      res.locals.layout = "layout/my_file_layout";
      res.view('auth/login');
      

      【讨论】:

        【解决方案4】:

        很抱歉向您发送垃圾邮件,但我的应用需要类似的解决方案。在 routes.js 中定义布局会很棒,例如 /admin/* 将使用一种布局,例如。 /app/* 将使用另一个,等等。因为它是一个皮塔饼,所以潜入控制器并使用静态布局路径过度垃圾邮件。我尝试了这个概念,但它似乎只有在我还在 routes.js 配置文件中定义一个控制器时才有效,例如:

        module.exports.routes = {
        
           '/admin/*' : {
              controller: 'AdminController',
              action: 'index',
              locals: {
                 layout: 'admin/layout'
              }
           }
        };
        

        这确实有效,但是将 admin 的所有操作路由到同一个控制器,这当然是错误的。如果我省略了控制器部分,则该概念始终使用默认的 view/layout.ejs 并且未设置本地:

        module.exports.routes = {
        
           '/admin/*' : {
              locals: {
                 layout: 'admin/layout'
              }
           }
        };
        

        这不起作用,但最好是这样。

        【讨论】:

          【解决方案5】:

          如果您需要在控制器中设置视图和布局(Sails v0.11):

          res.view('auth/login', { layout: null } );
          

          布局:

          null = 无

          '文件夹/布局' = 你的布局

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-12
            • 1970-01-01
            • 2018-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多