创建具有折叠(父/子)行的tbody

时间:2016-03-14 11:00:37

标签: knockout.js parent-child collapse expandable

我有一个tbody表,其中包含由淘汰视图模型支持的父子结构。父子结构如下所示:

<tbody>
    <!-- ko foreach: modelyears -->
        <tr>
            <td >
                <span data-bind="text: modelyear_name"></span>
            </td>
            <td>
            </td>
        </tr>
        <!-- ko foreach: projects -->
            <tr>
                <td >
                </td>
                <td>
                    <span data-bind="text: project_name"></span>
                </td>
            </tr>
        <!-- /ko -->
    <!-- /ko -->
</tbody>

如何使父行可扩展/可折叠? 我想点击父tr来显示/隐藏子行(项目)。

2 个答案:

答案 0 :(得分:0)

正如晚餐酷指出的,最好的解决方案是使用一些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添加/删除元素。您也可以使用可见代替 if 。区别在于可见呈现一次,然后在display / display:none之间切换,而 if 重新呈现。注意:检查语法,因为我还没有测试过这段代码。

答案 1 :(得分:0)

我自己用引导程序“崩溃”功能解决了这个问题。

“数据目标”是对敲除计算值的绑定,我从当前父级的ITEM ID中获取。

以下是HTML中的代码(我使用DIV进行父子表示,使用超链接属性来切换子项):

        '<!-- 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>'

在淘汰模型中计算的淘汰变量“child_id”和“data-target”和“project_classname”:

    // 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);

希望它可以帮助那里的人; - )