如何在knockout.js foreach绑定中有条件地渲染tr

0lu*_*sz0 6 javascript template-engine knockout.js

我想使用knockout动态渲染行和列.我的想法是,我希望用一些单元格填充每一行,并根据需要动态添加更多行.假设整个单元格数等于4*行数,然后我尝试:

<table>
    <tbody data-bind="foreach: model">
        <!--ko if: $index() % 4 == 0--><tr><!--/ko-->
         <td>
              <label data-bind="text: Value"></label>
         </td>
         <td>
              <input type="checkbox" data-bind="checked: IsChecked"/>
         </td>
         <!--ko if: $index() % 4 == 0--></tr><!--/ko-->
     </tbody>
 </table>
Run Code Online (Sandbox Code Playgroud)

但它的工作方式如下:

<table>
    <tbody data-bind="foreach: model">
        <!--ko if: $index() % 4 == 0-->
         <td>
              <label data-bind="text: Value"></label>
         </td>
         <td>
              <input type="checkbox" data-bind="checked: IsChecked"/>
         </td>
         </tr><!--/ko-->
     </tbody>
 </table>
Run Code Online (Sandbox Code Playgroud)

通过不用内容渲染整行,是否可以使用knockout渲染所有单元格并仅在需要时添加行?

作为一种解决方法,我考虑嵌套的foreach,但它需要我的模型从单维变为二维,这似乎很奇怪.

小智 14

添加另一个将数据构造成行的计算属性:

<table>
    <tbody data-bind="foreach: rows">
        <tr>
            <!-- ko foreach: $data -->
            <td data-bind="text:$index"></td>
            <td data-bind="text:fname"></td>
            <td data-bind="text:lname"></td>
            <!-- /ko -->
        </tr>
    </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

用代码:

var vm = {

    people: ko.observableArray([
        { fname: 'fname', lname: 'lname' },
        { fname: 'fname', lname: 'lname' },
        { fname: 'fname', lname: 'lname' },
        { fname: 'fname', lname: 'lname' }
    ])
};

vm.rows = ko.computed(function () {

    var itemsPerRow = 3, rowIndex = 0, rows = [];

    var people = vm.people();
    for (var index = 0; index < people.length; index++) {
        if (!rows[rowIndex])
            rows[rowIndex] = [];

        rows[rowIndex].push(people[index]);

        if (rows[rowIndex].length == itemsPerRow)
            rowIndex++;
    }

    return rows;
}, vm);

$(function () {
    ko.applyBindings(vm);
});
Run Code Online (Sandbox Code Playgroud)