44

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

在我的视图模型中,我有 2 个可观察数组,我想要一个计算的可观察数组,它只是两个数组的组合。

function ViewModel() {
    var self = this;
    self.listA= ko.observableArray([]);
    self.listB = ko.observableArray([]);
    self.masterList= //combine both list A and B
4

5 回答 5

33

这将组合两个数组并返回组合列表。但是,它不是一个计算的可观察数组(不知道这是否可能),而是一个常规的计算可观察数组。

self.masterList = ko.computed(function() {
    return this.listA().concat(this.listB());
}, this);
于 2012-07-02T18:17:05.360 回答
13
self.masterList = ko.observableArray();
ko.computed(function () {
    self.masterList(self.listA().concat(self.listB()));
});

在精神上类似于 Joe Flateau 的回答,但我喜欢认为这种方法更简单。

于 2014-04-17T14:54:31.557 回答
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;
};
于 2013-05-09T15:01:36.887 回答
6

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

于 2012-07-02T18:32:00.950 回答
3

我不确定这是否是最有效的选择 - 但它相当简单并且适合我。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(); 
});
于 2017-01-13T13:57:02.180 回答