Knockout.js 创建具有折叠(父/子)行的tbody
我有一个Knockout.js 创建具有折叠(父/子)行的tbody,knockout.js,parent-child,collapse,expandable,Knockout.js,Parent Child,Collapse,Expandable,我有一个tbody表,其父子结构由淘汰视图模型支持。父子结构如下所示: 如何使父行可展开/折叠? 我想单击父级tr以显示/隐藏子行(项目)。正如Super cool指出的,最好的解决方案是使用一些UI效果,允许您以更时尚的方式进行扩展。但是,简单的解决方案是维护一个布尔值,指示modelyear是否展开: <tbody> <!-- ko foreach: modelyears --> <tr data-bind="click: expan
tbody
表,其父子结构由淘汰视图模型支持。父子结构如下所示:
如何使父行可展开/折叠?
我想单击父级
tr
以显示/隐藏子行(项目)。正如Super cool指出的,最好的解决方案是使用一些UI效果,允许您以更时尚的方式进行扩展。但是,简单的解决方案是维护一个布尔值,指示modelyear是否展开:
<tbody>
<!-- ko foreach: modelyears -->
<tr data-bind="click: expandClose">
<td >
<span data-bind="text: modelyear_name"></span>
</td>
<td>
</td>
</tr>
<!-- ko foreach: projects -->
<tr data-bind="if: $parent.isExpanded">
<td >
</td>
<td>
<span data-bind="text: project_name"></span>
</td>
</tr>
<!-- /ko -->
<!-- /ko -->
</tbody>
expandClose只需在modelyear对象的isExpanded属性上的true/false之间切换(这必须是ko.observable)。这样,只要该属性为true/false,knockout就会向DOM添加/删除元素。如果,也可以使用可见,而不是。区别在于,可见渲染一次,然后在显示/显示:无之间切换,而如果重新渲染。注意:检查语法,因为我没有测试这段代码。我自己用引导“折叠”功能解决了这个问题 “数据目标”是一个与敲除计算值的绑定,我从当前父项的项ID获取该值 以下是HTML中的代码(我使用DIV表示父子关系,并使用超链接属性切换子关系):
希望它能帮助其他人;-) 代码看起来不错。您只需要在其中注入一些引导展开/展开。@Supercol不确定是否需要引入引导展开来进行展开/展开,手工制作的也可以。不过,一定要同意下面的信息:这篇文章与其说是一个问题,不如说是一个待办事项。@Jeroen yup一个手工制作的就可以了#同意。谢谢你的回答,这是另一个酷而简单的(!)解决方案:)
'<!-- ko foreach: modelyears -->
<div>
<table>
<tr>
<td >
<a href="#" data-toggle="collapse" data-bind="attr: {'id': child_id, 'data-target' : data_target }">
<span data-bind="text: modelyear_name" ></span>
</a>
</td>
</tr>
</table>
</div>
<!-- ko foreach: projects -->
<div data-bind="css: project_classname">
<table>
<tr>
<td></td>
<td colspan="2">
<div>
<span data-bind="text: project_name"></span>
</div>
</td>
</tr>
</table>
</div>
<!-- /ko -->
<!-- /ko -->
</div>'
// compute "project_classname"
this.project_classname = ko.computed(function() {
return "collapse row" + self.project_modelyear_itemid();
}, this);
// compute "child_id"
this.child_id = ko.computed(function ()
{
return "row" + self.modelyear_itemid();
}, this);
// compute "data_target"
this.data_target = ko.computed(function ()
{
return ".row" + self.modelyear_itemid();
}, this);