我有一个多维关联数组
this.items = ko.observableArray([
{ name: "name1", viewable: true, children: [
{ name: "name1-1", viewable: true, children: []},
{ name: "name1-2", viewable: false, children: []}
] },
{ name: "name2", viewable: false, children: [] },
{ name: "name3", viewable: true, children: [
{ name: "name3-1", viewable: true, children: []},
] },
{ name: "name4", viewable: true, children: [] }
]);
目的是循环遍历这个数组,只输出'viewable'设置为true的值。
我使用一堆if和foreach语句来工作,但是代码开始失控。这个例子只涵盖了2层,但是我的数组可以达到5层深度,所以这段代码将会成倍增加,变得很难看真的很快。
<ul data-bind="foreach: items">
<!-- ko if: viewable -->
<li data-bind="text: name"></li>
<!-- ko foreach: children -->
<!-- ko if: viewable -->
<li data-bind="text: name"></li>
<!-- /ko -->
<!-- /ko -->
<!-- /ko -->
</ul>
那么有没有一种更简单/更好的方法来循环遍历整个数组呢?JS提琴链接
Underscore.js有一些很好的处理数组的方法也许你可以使用flatten和filter从你的结构中创建一个数组然后你可以只写一个foreach
:
或者您可以使用模板来封装您的if: viewable
逻辑并递归地应用模板:
<script type="text/html" id="template">
<!-- ko if: viewable -->
<li data-bind="text: name"></li>
<!-- ko template: { name: 'template', foreach: $data.children } -->
<!-- /ko -->
<!-- /ko -->
</script>
<ul data-bind="template: { name: 'template', foreach: items } ">
</ul>
演示JSFiddle。
你需要的是一个模板:
<script type="text/html" id="ItemTemplate">
<!-- ko if: viewable -->
<li data-bind="text: name"></li>
<!-- ko template: { name: 'ItemTemplate', foreach: children } --><!-- /ko -->
<!-- /ko -->
</script>
然后只是:
<ul data-bind="template: { name: 'ItemTemplate', foreach: items }"></ul>
如果你在项上添加空的子数组,你可以使用模板
JSFiddle样本
<ul data-bind="foreach: items">
<idv data-bind="template: {name: 'mytemp'}" />
</ul>
<div data-bind="stopBinding:true">
<div id="mytemp">
<div data-bind="visible :viewable">
<li data-bind="text: name"></li>
<div data-bind="foreach: children">
<div data-bind="template: {name: 'mytemp'}" /></div>
</div>
</div>
</div>