如何在Sails.js上注册Handlebars部分外部partials文件夹?

时间:2015-05-29 13:39:20

标签: node.js express handlebars.js sails.js

我的Sails.js应用程序中有以下文件夹结构:

assets/ myModule/ views/ partials/ 其中myModule是一个Backbone组件(虽然我的客户端不是一个完整的Backbone应用程序)

有一个给定的Handlebar部分x.handlebars需要通过服务器端和客户端进行渲染。

我的斗争在客户端views/ 无法访问时开始,因此无法在Backbone模块上加载它。

然后我尝试将其移至可以访问的assets/myModule/templates/,但现在我的主模板views/layout.handlebars无法加载该部分,如果我尝试这样的话:

{{> ../assets/myModule/templates/x}}

也不行(我假设Handlebars使用views /作为布局的根级别。)

在这种情况下我只能看到两种可能的解决方案:

  • 复制这些布局并在每个位置使用一个(不理想,但有效)

  • 将其放在assets/myModules/templates/x上,并在Sails上注册部分Handlebars,让它可用​​于服务器端呈现。

我怎么能做第二个解决方案?是否可以使用config/views.js下的帮助函数以相同的方式注册全局部分?

我的目标是在配置级别使用Handlebars.registerPartial功能,在外部使用控制器,以便部分也可以被其他模板重用。

1 个答案:

答案 0 :(得分:2)

不需要复制代码。有许多不同的方法可以实现这一点,并取决于您将要寻找的优化配置文件。

一个简单的解决方案是使用节点的fs读取api / controller中的hbs文件,然后使用Handlebars编译它并将其传递给模板,如下所示:

var rawTemplate = fs.readFileSync('assets/hbs/client-side-template.hbs', "utf8");
var processedTemplate = Handlebars.compile(rawTemplate);

return res.render('whiteboard/dualloadview', {      
  myPartialAsVariable: processedTemplate({})
});

你必须弄清楚如何处理部分使用的上下文和变量。您还可以通过查看保持文件在内存中读取,以及如何使用Handlebars而不是使用变量来注册部分来改进此代码段。