我想知道如何创建一个计算的可观察数组。
在我的视图模型中,我有2个可观察数组,我希望有一个计算的可观察数组,它只是两个数组的组合。
function ViewModel() {
var self = this;
self.listA= ko.observableArray([]);
self.listB = ko.observableArray([]);
self.masterList= //combine both list A and B
答案 0 :(得分:33)
这将组合两个数组并返回组合列表。但是,它不是一个计算的可观察数组(不知道是否可能),而是一个常规的计算可观察数组。
self.masterList = ko.computed(function() {
return this.listA().concat(this.listB());
}, this);
答案 1 :(得分:11)
self.masterList = ko.observableArray();
ko.computed(function () {
self.masterList(self.listA().concat(self.listB()));
});
类似于Joe Flateau的精神回答,但我觉得这种方法更简单。
答案 2 :(得分:9)
我知道这是一个老问题,但我想我会把答案放在那里:
var u = ko.utils.unwrapObservable;
ko.observableArray.fn.filter = function (predicate) {
var target = this;
var computed = ko.computed(function () {
return ko.utils.arrayFilter(target(), predicate);
});
var observableArray = new ko.observableArray(u(computed));
computed.subscribe(function (newValue) { observableArray(newValue); });
return observableArray;
};
答案 3 :(得分:6)
observableArray只是一个具有更多属性的可观察对象。因此,在闭包中返回数组的计算observable将被视为数组。
答案 4 :(得分:2)
我不确定这是否是最有效的选择 - 但它相当简单并适合我。 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();
});