No estoy seguro de si esta es la opción más eficiente, pero es bastante simple y funciona para mí. Los rendimientos ko.computed una matriz observable como a continuación:
self.computedArrayValue = ko.computed(function() {
var all = ko.observableArray([]);
....
return all();
});
ejemplo de trabajo de un código: HTML:
<div data-bind="foreach: days">
<button class="btn btn-default btn-lg day" data-bind="text: $data, click: $root.dayPressed"></button>
</div>
función Javascript sobre el modelo de vista:
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();
});
creo esta respuesta es defectuosa para la mayoría de los casos de uso: el valor del observable calculado es un conjunto regular, no un conjunto observable (aproximadamente indicado en la respuesta). Por lo tanto, actualizar 'listA' o' listB' reemplazará por completo la matriz en sí en lugar de actualizar su contenido (que es lo que queremos en el 99% de los casos). ** Esto significa que no debe vincular las vistas a este observable. ** En efecto, este código es tan útil como su variante no computada. Ver otras respuestas para diferentes enfoques. – tne
No funcionará en este caso, pero el plugin knockout [knockout-projections] (https://github.com/stevesanderson/knockout-projections) implementa matrices observables computadas mucho más eficientes utilizando las nuevas [suscripciones de cambio de matriz] (http://blog.stevensanderson.com/2013/10/08/knockout-3-0-release-candidate-available/). Este complemento podría ampliarse para admitir una operación de concat eficiente. – Singularity