Как создать вычисляемый наблюдаемый массив в нокауте
Я хотел бы знать, как создать вычисляемый наблюдаемый массив.
В моей модели зрения у меня есть 2 наблюдаемых массива, и я хотел бы иметь вычисленный наблюдаемый массив, который объединяет оба массива.
function ViewModel() {
var self = this;
self.listA= ko.observableArray([]);
self.listB = ko.observableArray([]);
self.masterList= //combine both list A and B
Ответы
Ответ 1
Это объединит два массива и вернет объединенный список. Тем не менее, это не вычисленный наблюдаемый массив (не знаю, возможно ли это вообще), а регулярный вычисленный наблюдаемый.
self.masterList = ko.computed(function() {
return this.listA().concat(this.listB());
}, this);
Ответ 2
Я знаю, что это старый вопрос, но я подумал, что отвечу туда:
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
self.masterList = ko.observableArray();
ko.computed(function () {
self.masterList(self.listA().concat(self.listB()));
});
Подобно Джо Флато отвечают духом, но мне нравится думать, что этот метод проще.
Ответ 4
Наблюдаемый массив просто наблюдаемый с несколькими свойствами. Следовательно, вычисленный наблюдаемый, который возвращает массив в закрытии, будет рассматриваться как массив.
Ответ 5
Я не уверен, что это самый эффективный вариант, но он довольно прост и работает для меня. 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();
});