Я не уверен, что это самый эффективный вариант - но он довольно прост и работает для меня. В 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();
});
Я считаю, этот ответ испорчен для большинства случаев использования: значение вычисленного наблюдаемого является регулярным массивом, а не наблюдаемым массивом (примерно указанным в ответе). Следовательно, обновление 'listA' или' listB' полностью заменит сам массив, а не обновит его содержимое (чего мы хотим в 99% случаев). ** Это означает, что вы не должны привязывать представления к этому наблюдаемому. ** По сути, этот код так же полезен, как и его невычислимый вариант. См. Другие ответы для разных подходов. – tne
В этом случае это не сработает, но плагин для нокаута [нокаут-проекции] (https://github.com/stevesanderson/knockout-projections) реализует гораздо более эффективные вычислимые наблюдаемые массивы с использованием новых [подписки на изменение массива] (http://blog.stevensanderson.com/2013/10/08/knockout-3-0-release-candidate-available/). Этот плагин может быть расширен для поддержки эффективной операции concat. – Singularity