javascript knockout.js ko.observablearray

javascript - Reemplazando el artículo en observable Array



knockout.js ko.observablearray (3)

La función de reemplazo acepta dos parámetros, el elemento que desea reemplazar y el nuevo elemento con el que desea reemplazarlo. Está transfiriendo el índice en lugar del elemento a reemplazar para que no funcione.

La llamada de reemplazo debe ser:

self.locations.replace(oldLocation, new location(value));

En una nota lateral, no debería necesitar la llamada a valueHasMutated() allí, será invocada por la llamada a replace() .

Estoy tratando de reemplazar todos los contenidos de un elemento en una observableArray con contenido nuevo.

var oldLocation = ko.utils.arrayFirst(self.locations(), function (item) { return item.id == value.id; }); self.locations.replace(self.locations.indexOf(oldLocation), new location(value)); self.locations.valueHasMutated();

También intenté

self.locations[self.locations.indexOf(location)] = new fizi.ko.models.location(value);

Pero nada está funcionando. El índice se está recuperando correctamente, pero la actualización del elemento no está sucediendo.


No conozco un método de reemplazo en JavaScript para matrices, o en Knockout. ¿Me estoy perdiendo de algo?

Si desea utilizar su segundo método, debe acceder a las ubicaciones como observables:

self.locations()[self.locations.indexOf(location)] = new fizi.ko.models.location(value); self.locations.valueHasMutated();

aunque no lo haces cuando usas indexOf, ya que hay una versión de Knockout para arreglos observables.


Simplemente quiero mencionar una forma alternativa de hacerlo:

self.locations.splice( self.locations.indexOf(location), // Index of the 1st element to remove 1, // Number of elements to remote at this index new fizi.ko.models.location(value) // A param for each element to add at the index );

Knockout incluye splice en su documentación, pero no incluye replace : Knockout Obervable Arrays Docs . Sin embargo, si miras el código fuente verás que ambas funciones están implementadas (al menos en KO 3.0, no sé si faltó replace en versiones anteriores).