javascript - Mustache JS,如何创建一个子列表数量未知的递归列表?

标签 javascript recursion mustache

我已经在几个线程中看到过这个讨论,看起来这是(或现在)执行此操作的方法。但我似乎无法让它发挥作用。所以我一定遗漏了什么。

输出应该看起来像

<ul>
  <li>parent
     <ul> 
       <li>
          sub child
          <ul>
            <li> sub sub child</li>
          </ul>
       </li>
     </ul>
  </li>
</ul>

我得到的是

<ul>
  <li>parent
     <ul> 
       <li>
          sub child
       </li>
     </ul>
  </li>
</ul>

到目前为止我有什么


模板

<script type="text/template" id="template">
    <ul class="parent">
        {{#menu}}
        <li>
         {{item}}
         <ul class="popupmenu">
            {{#menu}}
           <li>{{item}}</li>
           {{/menu}}
        </ul>            
        </li>
        {{/menu}}
    </ul>
</script>

js

var data = {
    menu : [{
        "item" : "parent",
        "menu" : [{
            "item": "sub child",
            "menu": [{
                "item" : "sub sub child"  
            }]
         }]
    }]
};

var template = $("#template").html();

var rendered = Mustache.render(template, data);
$("body").html(rendered);

fiddle

https://jsfiddle.net/6g7wz5vL/22/

无论如何,我认为 mustache 会根据初始模板递归地创建子列表。但似乎我必须创建整个嵌套的 HTML 结构才能让它为下一个级别生成 HTML。

So do I have to do a template for each level? What am I missing that I only get the first sub level and not the second? Or is this just not possible with Mustache?

最佳答案

您缺少的是此类菜单的呈现必须是递归的。所以你需要在模板本身内部引用模板。幸运的是,mustache 通过 partials 构造具有此功能。所以你可以这样写:

var rendered = Mustache.render(template, data, {
    "recurse": "<ul class=\"submenu\">{{#menu}}<li>{{item}}{{>recurse}}{{/menu}}</ul>"
});

但是,由于 Mustache 始终会在对象图中的节点层次结构中向上移动,因此它始终会找到要呈现的“菜单”元素,因此这将导致数据无限循环。因此,需要像这样对您的数据进行额外更改:

var data = {
    menu : [{
        "item" : "parent",
        "menu" : [{
            "item": "sub child",
            "menu": [{
                "item" : "sub sub child",
                "menu": null
            }]
         }]
    }]
};

注意这里额外的 "menu": null 行。这将导致 Mustache 在看到它时终止递归。

我已经用这些更改更新了 fiddle :https://jsfiddle.net/6g7wz5vL/24/ .

关于javascript - Mustache JS,如何创建一个子列表数量未知的递归列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31885263/

相关文章:

mustache - 是否有适用于 Windows 的 Mustache 的独立可移植命令行实现?

javascript - 使用像 Mustache.js 这样的模板引擎

javascript - CanJs - 迭代 Mustache 中的数组并创建可观察值

javascript - 在 md-select 下拉列表中 chop 长项目的文本

java - 对字符串使用一些特定的附加操作检查它是否可以转换为其他字符串

Typescript - 类型安全深度省略,或 : how to list legal object paths

list - 搜索递归记录类型 OCaml

javascript - 使用 JavaScript 获取(索引)位图的颜色索引

javascript - 使用 selectfield 值查找 json 表

Javascript/Jquery 不会更改 Safari 中的 URL 参数,但会在 Chrome 中更改