observablearray knockout example delete data knockout.js ko.observablearray computed-observable

knockout.js - knockout - ko observable();



Cómo crear una matriz observable calculada en Knockout (5)

Esto combinará las dos matrices y devolverá la lista combinada. Sin embargo, no es una matriz observable calculada (no sé si eso es posible), sino un observable computable regular.

self.masterList = ko.computed(function() { return this.listA().concat(this.listB()); }, this);

Me gustaría saber cómo crear una matriz observable computada.

En mi modelo de vista, tengo 2 matrices observables, y me gustaría tener una matriz observable computada que sea simplemente ambas matrices combinadas.

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


No estoy seguro de si esta es la opción más eficiente, pero es bastante simple y funciona para mí. El ko.computed devuelve una matriz observable de la siguiente manera:

self.computedArrayValue = ko.computed(function() { var all = ko.observableArray([]); .... return all(); });

Un ejemplo de trabajo del 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 de Javascript en 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(); });


Sé que esta es una vieja pregunta, pero pensé que arrojaría mi respuesta allí:

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; };


Un array observable es solo un observable con algunas propiedades más. Por lo tanto, un observable calculado que devuelve una matriz en el cierre se tratará como una matriz.


self.masterList = ko.observableArray(); ko.computed(function () { self.masterList(self.listA().concat(self.listB())); });

Similar a la respuesta en espíritu de Joe Flateau, pero me gusta pensar que este método es más simple.