gpt4 book ai didi

javascript - 使用 knockoutjs 创建网格

转载 作者:行者123 更新时间:2023-11-30 12:29:39 26 4
gpt4 key购买 nike

假设我们有一个包含 N+1 个元素的可观察数组。我想要实现的是使用这些元素中的按钮构建 3 by X 网格。比如手机键盘之类的。

到目前为止我所做的是使用 foreach 创建一个表,如果在其中:

<table>
<tbody data-bind="foreach: tableList">
<!-- ko if: isEof($index()) -->
<tr>
<!-- /ko -->
<td><button data-bind="text: name"></button></td>
<!-- ko if: isEof($index()) -->
</tr>
<!-- /ko -->
</tbody>
</table>

isEof() 函数应该通过列表索引确定我们是否已经渲染了 3 个元素。如果是,那么它将呈现标签。此外,如果索引为 0,则它也会呈现元素。这是函数的代码:

function TableItem(data){
this.id=ko.observable(data.id);
this.name=ko.observable(data.name);
this.isEof = function(index){
if(index ==0){
return true;
}else{
if((index+3) % 3 === 0){
return true;
}else{
return false;
}
}
}
}

但我在使用此设置时遇到了两个问题。

1) 启用这些 if block 后,按钮名称绑定(bind)不起作用。当我删除 ko if block 时,它将正确呈现。

2) ko if 语句似乎不能正常工作。它将仅渲染出那些也允许渲染的行。

我已经制作了我的解决方案的 JSFiddle 示例:http://jsfiddle.net/kpihus/3Lw7xjae/2/

最佳答案

我会创建一个 ko.computed 将您的表项列表转换为数组数组:

var TableItem = function TableItem(data) {
this.id = ko.observable(data.id);
this.name = ko.observable(data.name);
};

var Vm = function Vm() {
this.tableItems = ko.observableArray([]);
this.columnCount = ko.observable(3);

this.columns = ko.computed(function() {
var columns = [],
itemCount = this.tableItems().length,
begin = 0;

// we use begin + 1 to compare to length, because slice
// uses zero-based index parameters
while (begin + 1 < itemCount) {
columns.push( this.tableItems.slice(begin, begin + this.columnCount()) );
begin += this.columnCount();
}

return columns;

// don't forget to set `this` inside the computed to our Vm
}, this);
};

vm = new Vm();

ko.applyBindings(vm);

for (var i = 1; i < 15; i++) {
vm.tableItems.push(new TableItem({
id: i,
name: "name: " + i
}));
}

这样,您可以通过嵌套两个 foreach 绑定(bind)来显示您的表格:

<table>
<tbody data-bind="foreach: { data: columns, as: 'column' }">
<tr data-bind="foreach: column">
<td>
<button data-bind="text: name">A</button>
</td>
</tr>
</tbody>
</table>

JSFiddle

如果您还没有使用过 ko.computed之前,它们跟踪在它们内部访问的任何可观察对象——在本例中为 this.tableItemsthis.columnCount——只要其中一个发生变化,它们就会再次运行并产生新的结果。

this.columns 获取我们的表项数组

[TableItem, TableItem, TableItem, TableItem, TableItem, TableItem]

并按this.columnCount将它们分组

[[TableItem, TableItem, TableItem], [TableItem, TableItem, TableItem]]

关于javascript - 使用 knockoutjs 创建网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28134641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com