我想知道如何创建一个计算的可观察数组。
在我的视图模型中,我有 2 个可观察数组,我想要一个计算的可观察数组,它只是两个数组的组合。
function ViewModel() {
var self = this;
self.listA= ko.observableArray([]);
self.listB = ko.observableArray([]);
self.masterList= //combine both list A and B
我想知道如何创建一个计算的可观察数组。
在我的视图模型中,我有 2 个可观察数组,我想要一个计算的可观察数组,它只是两个数组的组合。
function ViewModel() {
var self = this;
self.listA= ko.observableArray([]);
self.listB = ko.observableArray([]);
self.masterList= //combine both list A and B
这将组合两个数组并返回组合列表。但是,它不是一个计算的可观察数组(不知道这是否可能),而是一个常规的计算可观察数组。
self.masterList = ko.computed(function() {
return this.listA().concat(this.listB());
}, this);
self.masterList = ko.observableArray();
ko.computed(function () {
self.masterList(self.listA().concat(self.listB()));
});
在精神上类似于 Joe Flateau 的回答,但我喜欢认为这种方法更简单。
我知道这是一个老问题,但我想我会在那里回答:
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;
};
observableArray 只是一个具有更多属性的可观察对象。因此,在闭包中返回数组的计算 observable 将被视为数组。
我不确定这是否是最有效的选择 - 但它相当简单并且适合我。ko.computed 返回一个 observable 数组,如下所示:
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();
});