Daa*_*ron 18 javascript handlebars.js
我正在加载一个包含以下数据的模板:
"slides": [
{
"template": "video",
"data": {
"video": ""
}
},
{
"template": "image",
"data": {
"image": ""
}
}
]
Run Code Online (Sandbox Code Playgroud)
在我的模板中,我想循环遍历这些幻灯片,并根据配置的模板我想加载部分
{{#each slides}}
{{> resources_templates_overlay_video }}
{{/each}}
Run Code Online (Sandbox Code Playgroud)
如何动态地进行此部分加载(基于配置的模板)?
nik*_*shr 15
据我所知,hbs期望在编译时知道部分内容,这是在传递数据之前的方式.让我们解决这个问题吧.
首先,在渲染之前拉入动态部分,例如:
// I required the main template here for simplicity, but it can be anywhere
var templates = ['hbs!resources/templates/maintemplate'], l = data.slides.length;
for (var i=0; i<l; i++ )
templates.push('hbs!resources/templates/overlay/'+data[i].template);
require(templates, function(template) {
var html = template(data);
});
Run Code Online (Sandbox Code Playgroud)
并定义一个充当动态部分的帮助器
define(['Handlebars'], function (Handlebars) {
function dynamictemplate(template, context, opts) {
template = template.replace(/\//g, '_');
var f = Handlebars.partials[template];
if (!f) {
return "Partial not loaded";
}
return new Handlebars.SafeString(f(context));
}
Handlebars.registerHelper('dynamictemplate', dynamictemplate);
return dynamictemplate;
});
Run Code Online (Sandbox Code Playgroud)
最后,修改主模板看起来像
{{#each slides}}
{{dynamictemplate this.template this.data}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)