2

我正在尝试使用 Handlebars 呈现节点层次结构。我使用 require.js 和Handlebars 插件来拉取相关模板。我尝试调用部分递归地失败了。

样本数据

var data = {
    nodes: [
        {
            title: "node 1",
            nodes: [
                {title: "node 1-1"},
                {title: "node 1-2"}
            ]
        },
        {
            title: "node 2"
        }
    ]
};

需要打电话

require(['hbs!templates/linker/sub'], function(tpl) {
    console.log(tpl(data));
});

基本模板
模板/链接器/子

{{#if nodes}}
<ul>
    {{#each nodes}}
        <li>{{title}}
        </li>
    {{/each}}
</ul>
{{/if}}

输出(成功)

<ul>
   <li>node 1</li>
   <li>node 2</li>
</ul>

带有部分
templates/linker/sub2的模板,将前一个模板作为部分调用

{{#if nodes}}
<ul>
{{#each nodes}}
    <li>{{title}}
        {{> templates_linker_sub }}
    </li>
{{/each}}
</ul>
{{/if}}

输出(成功)

<ul>
    <li>node 1
        <ul>
            <li>node 1-1</li>
            <li>node 1-2</li>
        </ul>
    </li>
    <li>node 2</li>
</ul>

具有递归部分
模板/链接器/sub3的模板,将自身称为部分模板

{{#if nodes}}
<ul>
{{#each nodes}}
    <li>{{title}}
        {{> templates_linker_sub3 }}
    </li>
{{/each}}
</ul>
{{/if}}

输出(失败)

require.js 超时,没有输出。

假设我可以在此设置中使用递归部分,我错了吗?还是我在编写模板时遗漏了什么?

4

2 回答 2

2

As a workaround, I defined a custom helper to apply a previously registered partial. The partial has already been compiled and is available through Handlebars.partials

define(['Handlebars', 'underscore'], function (Handlebars, _) {
    function partial(template, context, options) {
        var f = Handlebars.partials[template];
        if (!_.isFunction(f)) {
            return "";
        }

        return new Handlebars.SafeString(f(context));
    }
    Handlebars.registerHelper('recursivepartial', partial);
    return partial;
});

My modified template looks like

{{#if nodes}}
<ul>
{{#each nodes}}
    <li>{{title}}
        {{recursivepartial "templates_linker_sub" this}}
    </li>
{{/each}}
</ul>
{{/if}}
于 2012-06-25T16:50:38.050 回答
1

我知道这已经很老了,但我刚刚创建了一个对 require-handlebars-plugin 存储库的拉取请求,它将解决这个问题。目前,插件将解析部分并将所有引用的部分添加为依赖项(因此创建循环引用。)请参见此处:https ://github.com/SlexAxton/require-handlebars-plugin/pull/229

于 2015-04-10T18:16:14.840 回答