Knockout.js - 动态列,但每行最多限制为5

Chr*_*isS 13 javascript knockout.js

我在这里找到了类似的问题/答案:如何使用一些固定列和一些动态列来呈现表

但它并没有完全解决我的问题.我试图弄清楚如何将动态列的数量限制为每行5个,如果视图模型中有超过5个项目,请为数组中的所有5个组创建一个新行并重复.

例如:

var vm = {
    item: { name: 'test1' },
    item: { name: 'test2' },
    item: { name: 'test3' },
    item: { name: 'test4' },
    item: { name: 'test5' },
    item: { name: 'test6' }
};
Run Code Online (Sandbox Code Playgroud)

给那个模型,我怎么能得到这个表?

<table>
   <tr>
      <td>test1</td>
      <td>test2</td>
      <td>test3</td>
      <td>test4</td>
      <td>test5</td>
   </tr>
   <tr>
      <td>test6</td>
   <tr>
</table>
Run Code Online (Sandbox Code Playgroud)

RP *_*yer 24

为了处理这种情况,我可能会将逻辑推送到您的视图模型中,以便您的视图可以保持简单.因此,我们的想法是使用dependentObservable来表示您的"行".然后,您的视图可以遍历行,然后遍历行中的单元格.

下面是一个示例,它使该列数成为可观察列,以便可以动态更新. http://jsfiddle.net/rniemeyer/9TN9W/

var viewModel = {
    items: ko.observableArray(),
    columnLength: ko.observable(5)  
};

//sample data
for (var i = 0; i < 100; i++) {
    viewModel.items.push({ name: 'test' + i });  
}

//return an array of rows.  Each row is an array of items
viewModel.rows = ko.dependentObservable(function() {
    var result = [],
        colLength = parseInt(this.columnLength(), 10),
        row;


    //loop through items and push each item to a row array that gets pushed to the final result
    for (var i = 0, j = this.items().length; i < j; i++) {
        if (i % colLength === 0) {
            if (row) {
              result.push(row);     
            }
            row = [];
        }
        row.push(this.items()[i]);
    }

    //push the final row  
    if (row) {
        result.push(row);
    }

    return result;
}, viewModel);
Run Code Online (Sandbox Code Playgroud)

  • 对于任何对解决方案示例感兴趣的人,我最终得到的是:http://jsfiddle.net/cmschick/hyHQW/最后我只是动态创建表.在这个例子中有很多事情,包括排序,绑定,更新,不包装文本的动态列等,但它可能对某人有帮助. (2认同)