【问题标题】:How to achieve recursive templates with jqueryjquery如何实现递归模板
【发布时间】:2011-11-07 02:15:40
【问题描述】:

我从数据库中获取一个 json,然后动态加载一个模板并应用该 json。此变量中存储的数据是自引用的(典型的 id - parent_id)。 我无法对该数据进行递归。

json:

var my_json = {"modules":[
    {
        "id_modules": "1",
        "id_modules_parent": "0",
        "mod_name": "mod 1",
        "sub_modules": [
            {
                "id_modules": "2",
                "id_modules_parent": "1",
                "mod_name": "mod 1a",
                "sub_modules": ""
            },
            {
                "id_modules": "3",
                "id_modules_parent": "1",
                "mod_name": "mod 1b",
                "sub_modules": ""
            }
        ]
    },
    {
        "id_modules": "4",
        "id_modules_parent": "0",
        "mod_name": "mod 2",
        "sub_modules": [
            {
                "id_modules": "5",
                "id_modules_parent": "4",
                "mod_name": "mod 2a",
                "sub_modules": [
                    {
                        "id_modules": "7",
                        "id_modules_parent": "5",
                        "mod_name": "mod 2aa",
                        "sub_modules": ""
                    }
                ]
            },
            {
                "id_modules": "6",
                "id_modules_parent": "4",
                "mod_name": "mod 2b",
                "sub_modules": ""
            }
        ]
    }
]}

这是我渲染模板的方式:

$.get("template_file.txt", function(template)
{
    $.tmpl(template, my_json).appendTo("#some_div");
});

最后是模板(template_file.txt):

<ul class="modules_ul">
    {{each(i, module) modules}}
        <li>${module.mod_name}</li>
        {{each(j, submodule) module.sub_modules}}

            {{tmpl(submodule) ".modules_ul" }} //what goes here?

        {{/each}}
    {{/each}}
</ul>

有人可以帮我吗?提前致谢!

编辑: 添加了jsfiddle 来玩

解决方案:post中查看 mblase75 的回答

【问题讨论】:

  • 您可以控制 JSON 对象吗?因为只要您使用结构化数据,就没有理由为任何内容包含父 ID。
  • 你是对的,没有理由包含它,但问题仍然存在......
  • 你不需要一些东西来显示一些数据,而不仅仅是构建一棵树吗?

标签: jquery templates recursion jquery-templates


【解决方案1】:

应该是这样的

<ul class="modules_ul">
    {{each(i, module) modules}}
        <li>${module.mod_name}</li>
        {{if module.sub_modules}}
            {{tmpl(module.sub_modules) "template_name"}}
        {{/if}}
    {{/each}}
</ul>

【讨论】:

    【解决方案2】:

    这个递归模板适合我。与您的示例几乎没有区别:模板是内联的,模板是通过 id 而不是类访问的,并且在渲染嵌套模板之前添加了额外的 if 检查。

    顺便问一下,你得到什么样的错误?模板根本不渲染吗?

    <script type="text/javascript">
        var data =
        {
            name: "Root",
            children:
            [
                { name: "Child1",
                    children:
                    [{ name: "SubChild1"}]
                },
                {
                    name: "Child2",
                    children:
                    [{ name: "SubChild2"}]
                }
            ]
        };
    
        $(function () {
            $("#template").tmpl(data).appendTo("#target");
    
        });
    </script>
    <script type="text/html" id="template">
    <div id="template">
        <h3>
            ${name}</h3>
        <div style="position:relative; margin-left:10px">
            {{if children}} 
                {{each(i, child) children}} 
                    {{tmpl(child) "#template" }}
                {{/each}}
            {{/if}}
        </div>
    </div>
    </script>
    <div id="target">
    </div>
    

    【讨论】:

    • 嘿!你能创建一个工作的jsfile吗?我得到的错误是:“c.tmpl 不是函数”
    【解决方案3】:

    为什么不使用模板呢?您需要创建一个自身递归的 JavaScript 函数:

    function recursive(modules) {
        var arr_html = new Array;
        for (var j=0; j<modules.length; j++) {
            arr_html.push("<ul>");
            arr_html.push("<li>"+modules[j].mod_name+"</li>");
            if (modules[j].sub_modules.length) // it's an array
                arr_html.push(recursive(modules[j].sub_modules));
            arr_html.push("</ul>");
        }
        return arr_html.join("");
    }
    $('body').append(recursive(my_json.modules));
    

    【讨论】:

    • 因为我需要将 HTML 放在一个单独的文件中。
    • 您已经在使用.tmpl() 混合JavaScript 和HTML;唯一的问题是你要走多远。我还不熟悉.tmpl(),但我不明白如何将一个模板包含在另一个模板中。
    • 好吧,如果有基于模板的解决方案,那么我将是第二个使用它的人。
    • 问题是实际上有一个基于模板的解决方案,但我可以让它工作。我写的那一行是“//whar 到这里吗?”请参阅:link 他们使用
    • 这是关于递归模板的 jQuery 文档(向下滚动一点):api.jquery.com/template-tag-tmpl
    猜你喜欢
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2013-02-23
    • 2022-11-03
    • 1970-01-01
    • 2011-11-08
    相关资源
    最近更新 更多