4

在 Knockout JS 中,是否可以执行foreach2 递增的操作?类似于:

for (var i = 0; i < array.length; i += 2) {
    // Do stuff
}

我想这样做的原因是因为我需要循环的数据是一个数组而不是一个对象。例子:

viewModel = function () {
    this.facets = ["Sample", 100, "Sample 2", 200];
}

但是数据需要这样显示:

<ul data-bind="foreach: facets"> <!-- Can this foreach be incremented by 2? -->
    <li>$data[$index]: $data[$index + 1]</li>
</ul>

任何帮助将不胜感激。

4

4 回答 4

5

您可以为此编写一个自定义绑定处理程序,但我宁愿让模板远离这些丑陋的细节。

我建议写一个ko.computed

function Model() {
    this.data = ko.observableArray(["Sample", 100, "Sample 2", 200])
    this.items = ko.computed(function() {
        var value = [];
        var data = this.data();
        for (var i=0; i<data.length; i+=2) {
            value.push({ key: data[i], value: data[i+1]);
        }
        return value;
    }, this);
}

var model = new Model();

现在您可以遍历items模板中的 并访问keyvalue。更新原始data数组将自动重建items计算出的 observable。

模板代码如下所示:

<ul data-bind="foreach: items">
    <li><span data-bind="text: key"></span>: <span data-bind="text: value"></span></li>
</ul>
于 2013-01-28T19:08:29.043 回答
2

我的重复绑定 ( https://github.com/mbest/knockout-repeat ) 允许您指定一个step选项。

<ul>
    <li data-bind="repeat: {foreach: facets, step: 2}"
        data-repeat-bind="text: facets[$index] + ': ' + facets[$index+1]">
    </li>
</ul>
于 2013-01-28T21:10:05.460 回答
1

这可能是您正在寻找的:

for (var i = 0; i < array.length; i += 2) {
    var sample = array[i];
    var number = array[i+1];
    var display = "<li>" + sample + ": " + number + "</li>" // display this
}

不过,看起来你已经有了它,所以我不确定问题是什么......

于 2013-01-28T19:06:08.417 回答
0

您可以使用函数来创建需要绑定到的结构:

 self.arrayFunc = function() {
    var result = [];

    for (var i = 0, length = array.length; i += 2) {
        result.push({first: array[i], second: [i + 1]};
    }

};
于 2013-01-28T19:06:11.123 回答