如何使用把手模板动态加载不同的部分?

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)

如何动态地进行此部分加载(基于配置的模板)?

我正在使用require-handlebars-plugin

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)

  • 尼斯.虽然我发现很多东西需要这种解决方法来做一些非常简单的事情,但它确实让我脱离了Handlebars.我希望"模板中没有逻辑"的东西不是_quite_如此刻板. (3认同)
  • `Handlebars.partials []`似乎返回一个包含原始模板而不是函数的String.我假设有一些内部变化?任何人都知道如何实现这一目标吗? (2认同)