Я пытался понять это довольно давно. Я не мог найти ничего, что могло бы решить эту проблему, но, пожалуйста, поправьте меня, если я ошибаюсь.KnockoutJS: обновление/вставка данных в viewModel с использованием сопоставления
Проблема: У меня есть данные из API JSON, входящие в состав, с вложенной структурой массива/объекта. Я использую сопоставление, чтобы первоначально заполнить модель моими данными. Чтобы обновить это, я хочу расширить модель, если появятся новые данные, или обновить существующие данные.
Насколько я понял, ключ опции сопоставления должен делать этот трюк для меня, но я мог бы неправильно понять функциональность параметров сопоставления.
Я сводились эту проблему, чтобы быть представленными в этом примере:
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);
Fiddle: http://jsfiddle.net/mikaelbr/gDjA7/
Как вы можете видеть, первая строка вставляет данные. Все хорошо. Но когда я пытаюсь обновить, он заменяет содержимое. То же самое для третьего отображения; он заменяет содержимое, а не расширяет его.
Я использую это неправильно? Должен ли я пытаться расширить содержимое «вручную» перед использованием сопоставления?
Редактировать Решение:
Я решил этот случай, имея второй вспомогательный массив, хранящий все существующие модели. По новым данным я расширил этот массив и обновил модель представления, чтобы содержать накопленные элементы.
При обновлении (в моем случае сообщение WebSocket) я прокрутил модели, изменил содержимое рассматриваемого элемента и использовал значение методаHasMutated(), чтобы уведомить измененное значение для библиотеки Knockout.
Да. Это более или менее, как я решил это. – mikaelb
Любые мысли по этому поводу: http://stackoverflow.com/questions/20397054/knockout-js-mapping-keys-and-kendo-ui-grid – jtromans