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).