Nie jestem pewien, czy jest to najbardziej wydajna opcja - ale jest dość prosta i działa dla mnie. W ko.computed Zwraca obserwowalne array jak poniżej:
self.computedArrayValue = ko.computed(function() {
var all = ko.observableArray([]);
....
return all();
});
przykład roboczych kodu: HTML:
<div data-bind="foreach: days">
<button class="btn btn-default btn-lg day" data-bind="text: $data, click: $root.dayPressed"></button>
</div>
funkcji JavaScript na modelu Widok:
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();
});
wierzę ta odpowiedź jest wadliwa dla większości przypadków użycia: wartość wyliczonego obserwowalnego jest regularną tablicą, a nie tablicą obserwowalną (z grubsza określoną w odpowiedzi). Dlatego aktualizacja 'listA' lub' listB' całkowicie zastąpi samą tablicę zamiast aktualizować jej zawartość (czego chcemy w 99% przypadków). ** Oznacza to, że nie powinieneś wiązać widoków z tym obserwowalnym. ** W efekcie ten kod jest tak samo użyteczny, jak jego niewykonany wariant. Zobacz inne odpowiedzi dla różnych podejść. – tne
Nie zadziała w tym przypadku, ale wtyczka knockout [knockout-projections] (https://github.com/stevesanderson/knockout-projections) implementuje znacznie bardziej wydajne obliczalne obserwowalne tablice za pomocą newish [array change subcriptions] (http://blog.stevensanderson.com/2013/10/08/knockout-3-0-release-candidate-available/). Tę wtyczkę można rozszerzyć, aby obsługiwała wydajną operację konkatycji. – Singularity