我不确定这是否是最有效的选择 - 但它非常简单,适用于我。所述ko.computed返回可观察到的阵列如下:
self.computedArrayValue = ko.computed(function() {
var all = ko.observableArray([]);
....
return all();
});
代码的一个工作例子: HTML:
<div data-bind="foreach: days">
<button class="btn btn-default btn-lg day" data-bind="text: $data, click: $root.dayPressed"></button>
</div>
上视图模型
Javascript函数:
self.days = ko.computed(function() {
var all = ko.observableArray([]);
var month = self.selectedMonth(); //observable
var year = self.selectedYear(); //observable
for (var i = 1; i < 29; i++) {
all.push(i);
}
if (month == "Feb" && year % 4 == 0) {
all.push(29);
} else if (["Jan","Mar","May","Jul","Aug","Oct","Dec"].find((p) => p == month)) {
[29,30,31].forEach((i) => all.push(i));
} else if (month != "Feb") {
[29,30].forEach((i) => all.push(i));
}
return all();
});
相信这个答案在大多数用例中都是有缺陷的:计算的observable的值是一个常规数组,而不是可观察数组(大致在答案中陈述)。因此,更新'listA'或'listB'将完全替换数组本身,而不是更新其内容(这是我们在99%的情况下所需的)。 **这意味着您不应该将视图绑定到此可观察对象。**实际上,此代码与非计算对象一样有用。查看不同方法的其他答案。 – tne
在这种情况下它不起作用,但是淘汰赛插件[knockout-projections](https://github.com/stevesanderson/knockout-projections)使用新的[数组变更订阅]实现了效率更高的可观察数组http://blog.stevensanderson.com/2013/10/08/knockout-3-0-release-candidate-available/)。这个插件可以扩展以支持高效的concat操作。 – Singularity