如何在Knockout中创build一个计算的可观察数组

我想知道如何创build一个计算观察数组。

在我的视图模型中,我有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); 

我知道这是一个古老的问题,但我想我会在那里把我的答案:

 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; }; 
 self.masterList = ko.observableArray(); ko.computed(function () { self.masterList(self.listA().concat(self.listB())); }); 

类似于Joe Flateau在精神上的回答,但是我想这种方法更简单。

observableArray只是一个具有更多属性的可观察对象。 因此,在闭包中返回数组的计算观察值将被视为一个数组。

我不确定这是否是最有效的select – 但它相当简单,适用于我。 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(); }); 
    Interesting Posts