如何在Sails.js中配置Handlebars的部分和布局?

时间:2013-11-06 11:17:15

标签: javascript handlebars.js sails.js

我运行Sails 0.9.7并安装了Handlebars支持的Consolidate.js,因此supported by Sails

我可以提供来自.handlebars文件的网页,它运行得很好。 我无法确定在哪里,在Sails工作流程中,以及 Sails方式,我应该注册部分,帮助等...我更多地寻找最佳实践,而不仅仅是工作解决方案但任何帮助将不胜感激。

7 个答案:

答案 0 :(得分:8)

我正在运行v0.10测试版,但这不应该影响我在下面的工作方式:

  1. 引擎应按预期把手
  2. 路由需要明确定义控制器和操作。设置视图不起作用。 (除非有一种方法我无法弄清楚路线文件中的局部设置)
  3. 控制器需要将部分定义为相对于视图的路径。
  4. <强>配置/ views.js

    module.exports.views = {
      engine      : 'handlebars',
      layout      : false
    };
    

    <强>配置/ routes.js

    '/': {
      controller: 'site',
      action: 'index'
    },
    

    <强> SiteController.js

    module.exports = {
      // Render Index View
      index: function(req, res) {
        res.view({
          partials: {
            head: 'partials/head',
            tail: '../partials/tail',
          },
        });
      }
    };
    

    <强>视图/站点/ index.handlebars

    {{> head}}
    <h3>SITE INDEX</h3>
    

    <强>视图/站点/分音/ head.handlebars

    <h1>HEAD</h1>
    {{> tail}}
    

    <强>视图/分音/ tail.handlebars

    <h2>HEAD TAIL</h2>
    

    输出

    <h1>HEAD</h1>
    <h2>HEAD TAIL</h2>
    <h3>SITE INDEX</h3>
    

答案 1 :(得分:4)

我正在使用上面给出的答案,但我似乎已经使部分工作与风帆0.9.8没有黑客。

这就是我所拥有的。

Config / views.js =&gt; 发动机:“车把”

views / home / index.handlebars =&gt;使用partial的主文件。

views / home / partials / partial.handlebars =&gt;部分被使用。

然后只要你使用这样的东西,它就能完美地运作。     res.view({         部分:{           partial:'partials / partial',           页脚:'partials / footer'         }     })

路径相对于默认调用的模板文件。因此,如果你想要每个控制器不同的部分,你使用部分/ 如果你想要所有模板的全局部分,你可以使用../ partials /

显然这完全是你的,因为你需要在控制器中手动指定每个部分。

答案 2 :(得分:2)

编辑:这很容易通过express3-handlebars模块实现,同时不更改任何默认的Sails功能,除了要求您将布局文件移动到views/layouts。如果你想查看,我在这里打开了一个拉取请求(https://github.com/balderdashy/sails/pull/1075)。


在对sails源代码进行一些挖掘之后,在渲染视图时引入部分内容相当容易。

当您在控制器操作中调用res.view时,只需传入一个partials对象作为“locals”的一部分,其中包含您要渲染的部分列表。

  // LoginController.js
  new: function (req, res) {
    res.view({
        partials: { 
          header: '../partials/header',
          footer: '../partials/footer'
        }
    })
  }

  // new.handlebars
  {{> header}}
      <b>Main content</b>
  {{> footer}}

通过附加名为helpers的密钥并传递功能,可以以类似的方式注册助手。

如果在Sails核心中有一个更正式的方法来做这件事会很好,但是现在这对于那些想要使用把手而不是ejs同时保留一些相似的布局的人来说已经足够了。

答案 3 :(得分:2)

FYI,

如果您使用的是Sails 0.10或更高版本,我已发布了一个NPM包,可在https://www.npmjs.org/package/sails-generate-views-handlebars生成默认句柄视图

当使用'sails generate -t​​emplate == handlebars'而没有额外的代码并基于路径自动发现部分时,还有一个为sails-generate-backend提出的PR以便正确支持车把的布局和部分( aka。views / partial / **)

请参阅:https://github.com/balderdashy/sails-generate-backend/pull/9

答案 4 :(得分:1)

我已经没时间了,但我想接近答案。当我得到更多详细信息时,我会更新此回复,但是如果您想查看它,请查看包含的consolidate.js文件中的第501行。在github上查看:https://github.com/balderdashy/sails/blob/master/lib/configuration/consolidate.js#L501

对于Handlebars来说,有一个for循环可以记录来自options.partials的部分内容。

这不是一个非常令人满意的解决方案,但是如果你把你的部分内容推到那个选项对象上,那么也许它会从中拉出来。

我接下来的一个重要问题是,什么是选项对象,以及它在何处设置?

答案 5 :(得分:0)

要在帆js中配置把手模板,请按照以下步骤操作:

1)在应用程序的node_modules文件夹中安装把手:

  

npm install handlebars

2)更改你的config / views.js

engine:   'handlebars',
layout:   'layouts/layout', // layouts is subfolder of view folder in sails app and layout is a handlebars inside layouts folder.
partials: 'partials'

答案 6 :(得分:0)

如果我们使用.handlebars扩展名来代替.hbs,Sails本身支持把手及其(多布局,局部)。

因此,为了在Sails而不是EJS中使用把手,建议使用合并(它是模板引擎安慰库)。把手适用于 SailsJs +合并

您需要安装合并。

npm install consolidate --save

然后您只需使用以下内容更新 config / views.js 文件。

module.exports.views = {

engine: {
    ext: 'handlebars',
    fn: require("consolidate").handlebars
  },

layout: 'layouts/layout',

partials: 'partials/'

};

将所有.ebs文件更新为.handlebar文件并更新其中的代码。

一切都会好起来的。

有一个 view-generator ,为了以后的目的,它将为Sails生成默认视图(它将创建一个默认目录结构,其中包含默认文件)。

您可以在github存储库中找到它。(https://github.com/bhaskarmelkani/sails-generate-views-hbs

它类似于SailsJs正式推出的名为 balderdashy / sails-generate-views-jade 的玉器。