【问题标题】:Multiple layouts with Handlebars and ExpressJS?Handlebars 和 ExpressJS 的多种布局?
【发布时间】:2015-08-08 15:40:33
【问题描述】:

如果我使用 Handlebars 作为 Express 4 的模板引擎,似乎只能选择指定一个布局模板用于所有视图:

app.engine('hbs', expressHbs({extname:'hbs', defaultLayout:'layout.hbs'}));

如果您的应用需要多个布局怎么办?如果viewA.hbs 使用一种布局而viewB.hbs 需要不同的布局怎么办?

当我学习 nodejs 时,我来自 PHP Laravel 背景,Blade templating engine 让您指定在每个视图文件的顶部使用哪种布局。它使在任何给定视图的布局模板之间切换变得非常简单。

【问题讨论】:

    标签: node.js express template-engine handlebars.js


    【解决方案1】:

    确保首先在 /layouts 目录中创建两个名为“main.handlebars”和“backend.handlebars”的文件:

    如果您愿意,请在两条路线上尝试此代码

    router.get('/', function(req, res) {
        res.render('home', {layout: 'main'});
    });
    
    router.get('/backend', function(req, res) {
        res.render('home', {layout: 'backend'});
    });
    

    【讨论】:

      【解决方案2】:

      如果你使用express-hbs,你可以在模板中指定一个布局,注释如下:

      {{!< layout}}
      

      或者,您可以尝试exphbs。它还支持布局 cmets,可以嵌套多个布局。 (免责声明:我写的。)

      【讨论】:

      • 谢谢。附带问题:为什么会有这么多不同的快速车把实现? express-hbs, exphbs, expressHbs 等?
      • 很高兴你问。我觉得我没有资格回答这个问题。但根据我自己的经验,一个充满活力的社区通常是一件好事。 :)
      • 唯一的缺点是项目 A 实施了好主意 #1,项目 B 实施了好主意 #2。你不能两者兼得,如果人们只是在一个项目上合作,同时包含两个伟大的想法,那就更好了。
      【解决方案3】:

      当您调用渲染方法时,您应该能够从路由/控制器中传入布局。

      router.get('/', function(req, res) {
          res.render('home', {layout: 'viewBLayout.hbs'});
      });
      

      我很确定 Jade 可以让您从模板内部切换布局,但我不知道您是否可以使用把手做到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-08
        • 2012-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多