Knockout: частичное сопоставление массивов

Взгляните на этот небольшой пример.

<select data-bind="options: Days, optionsText: 'title'"></select>
<input type="button" value="update" data-bind="click: update" />

<script type="text/javascript">
var Days = {'Days': [{"id":1,"title":"Monday"},{"id":2,"title":"Tuesday"},{"id":3,"title":"Wensday"}]};

var DaysUpdate = {'Days': [{"id":3,"title":"Wednesday"},{"id":4,"title":"Thursday"},{"id":5,"title":"Friday"}]};

var mapping = {    
    'Days': {        
        key: function(data) {            
            return ko.utils.unwrapObservable(data.id);        
        }    
}}

var viewModel = {
    Days: ko.observableArray(),
    update: function() {
        ko.mapping.fromJS(DaysUpdate, mapping, viewModel);
    }
}

ko.mapping.fromJS(Days, mapping, viewModel);


ko.applyBindings(viewModel);

</script>

В этом примере данные отображаются частично. Сначала из объекта Days, затем (нажав кнопку обновления) из объекта DaysUpdate. Второе обновление удаляет из массива объекты «Понедельник» и «Вторник». Как мне заставить их остаться?

PS. Спасибо Марку Робинсону за более структурированный пример.


person Dziamid    schedule 12.04.2012    source источник
comment
Эта скрипка демонстрирует вашу проблему. Возможно, другой пользователь SO может использовать его для решения. jsfiddle.net/unklefolk/PfFf9/1   -  person Mark Robinson    schedule 12.04.2012
comment
Здорово! Спасибо за скрипку. Я буду ссылаться на него в вопросе.   -  person Dziamid    schedule 12.04.2012
comment
@Dziamid - я только что исправил небольшую опечатку в вашем коде, после сопоставления «Дни» был пробел, из-за которого ключ не использовался. Однако это не влияет на мой ответ.   -  person madcapnmckay    schedule 12.04.2012


Ответы (1)


Это распространенный вопрос о плагине отображения. В настоящее время нет возможности сделать это с помощью самого плагина. Какое-то время меня это беспокоило. Плагин предполагает, что массив, который вы ему дали, является новым содержимым массива, поэтому удаляет другие элементы.

Единственное решение, которое я знаю в настоящее время, - это перебрать коллекцию и вручную сопоставить каждый элемент.

http://jsfiddle.net/madcapnmckay/5878E/

На днях я попытаюсь найти правильное решение и отправить запрос на вытягивание ребятам из плагина сопоставления.

Надеюсь это поможет.

person madcapnmckay    schedule 12.04.2012