He estado tratando de resolver esto desde hace bastante tiempo. No pude encontrar nada que solucione este problema, pero por favor corrígeme si me equivoco.KnockoutJS: Actualizar/Insertar datos en un modelo de vista usando mapeo
Problema: Tengo datos de una API JSON entrando, con una matriz anidada/estructura de objetos. Uso el mapeo para llenar inicialmente el modelo con mis datos. Para actualizar esto, quiero extender el modelo si llegan nuevos datos o actualizar los datos existentes.
Por lo que descubrí, la clave de opción de mapeo, debería hacer este truco para mí, pero podría haber malinterpretado la funcionalidad de las opciones de mapeo.
He reducía el problema a ser representado por el siguiente ejemplo:
var userMapping = {
key: function(item) {
return ko.utils.unwrapObservable(item.id);
}
};
// JSON call replaced with values
var viewModel = {
users: ko.mapping.fromJS([], userMapping)
};
// Should insert new - new ID?
ko.mapping.fromJS([{"id":1,"name":"Foo"}, {"id":2,"name":"Bar"}], userMapping, viewModel.users);
// Should only update ID#1 - same ID?
ko.mapping.fromJS([{"id":1,"name":"Bat"}], userMapping, viewModel.users);
// Should insert new - New ID?
ko.mapping.fromJS([{"id":3,"name":"New"}, {"id":4,"name":"New"}], userMapping, viewModel.users);
ko.applyBindings(viewModel);
violín: http://jsfiddle.net/mikaelbr/gDjA7/
Como se puede ver, la primera línea inserta los datos. Todo bien. Pero cuando intento actualizar, reemplaza el contenido. Lo mismo para el tercer mapeo; reemplaza el contenido, en lugar de ampliarlo.
¿Lo estoy usando mal? ¿Debo tratar de extender el contenido "manualmente" antes de usar el mapeo?
Editar Solución:
que resuelve este caso por tener una segunda matriz ayudante de almacenar todos los modelos actuales. En los datos nuevos amplié esta matriz y actualicé el modelo de vista para contener los elementos acumulados.
En la actualización (En mi caso, un mensaje de WebSocket), hice un bucle a través de los modelos, cambié el contenido del artículo en cuestión, y usé el método valueHasMutated() para notificar el cambio de valor a la lib de Knockout.
Sí. Esto es más o menos cómo lo resolví. – mikaelb
Cualquier idea sobre esto: http://stackoverflow.com/questions/20397054/knockout-js-mapping-keys-and-kendo-ui-grid – jtromans