我的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
功能,在外部使用控制器,以便部分也可以被其他模板重用。
答案 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而不是使用变量来注册部分来改进此代码段。