MustacheJS 渲染嵌套 JSON 使用部分

MustacheJS rendering nested JSON using partials

我正在尝试使用 Mustache 局部渲染我的嵌套(可以是多级)JSON。它只渲染到第二级,而不是第三级和更高级别。根据定义,部分可用于递归渲染。我做错了吗?或者有没有其他方法可以使用小胡子实现同样的效果?

JS Bin

Template:

<script id="product-list" type="x-tmpl-mustache">
  <ul class='products'>
    {{#product}}
      <li class='product'> {{ productName }} </li>
      {{> recurse }}
    {{/product}}
    {{^product}}
      <li class='empty'> No products Available </li>
    {{/product}}
  </ul>
</script>

<script id="recursive-list" type="x-tmpl-mustache">
  <ul class='products'>
    {{#product}}
      <li class='product'> {{ productName }} </li>
    {{/product}}
  </ul>
</script>

Data:

var data = {
    product: [{
        productName: "Category1",
        product: [{
            productName: "Windows"
        }, {
            productName: "Windows Mobile"
        }]
    }, {
        productName: "Category2",
        product: [{
            productName: "SubCategory 1",
            product: [{
                productName: "Nexus 4"
            }, {
                productName: "Nexus 6"
            }]
        }, {
            productName: "SubCategory 2",
            product: [{
                productName: "ipod"
            }, {
                productName: "iphone"
            }]
        }]
    }]
};

Rendering:

$('body').html( Mustache.render( productList.html(), data, {recurse :recursiveList.html()}) );

Output (missing products: Nexus 4, Nexus 5, ipod, iphone)

Category1

 - Windows
 - Windows Mobile

Category2

 - SubCategory 1
 - SubCategory 2

Got the solution 来自 MustacheJS 维护者,

工作JSBin

我只能使用 product-list 模板,因为 product-listrecurisve-list 都相似:$('body').html(Mustache.render(productList.html(), data, {recurse: productList.html()}));

不过,如果您这样做,您将得到 maximum call stack size exceeded,这可能是您意想不到的。这是因为,通过按照您的方式构建数据和模板,您创建了无限递归。在尾部产品(如 Nexus 4、Nexus 6、iPod 等)中,模板将查找 product 属性 但找不到。所以它将返回上下文堆栈,并检查每个级别,直到找到带有 product 属性 的内容。您可以通过确保叶产品具有 product 属性 和 false, null or [].

这样的值来阻止这种情况

新数据:

var data = {
        product: [{
            productName: "Category1",
            product: [{
                productName: "Windows",
                product: null
            }, {
                productName: "Windows Mobile",
                product: null
            }]
        }, {
            productName: "Category2",
            product: [{
                productName: "SubCategory 1",
                product: [{
                    productName: "Nexus 4",
                    product: null
                }, {
                    productName: "Nexus 6",
                    product: null
                }]
            }, {
                productName: "SubCategory 2",
                product: [{
                    productName: "ipod",
                    product: null
                }, {
                    productName: "iphone",
                    product: null
                }]
            }]
        }]
    };