У меня проблема с нокаутом js и плагином сопоставления с иерархической моделью представления.
Моя модель представления устроена примерно так:
VM = {
members:[
{
name:"name 1",
volunteering:[{...},{...},{...}]
},
{
name:"name 1",
volunteering:[{...},{...},{...}]
}
]
}
Каждый участник находится на вкладке, и каждая вкладка имеет сетку волонтерской деятельности. При нажатии на элемент в сетке открывается диалоговое окно для редактирования волонтерской деятельности. На этом этапе я клонирую объект, чтобы упростить функцию «отменить редактирование».
var Volunteer = {};
var koContext=ko.contextFor(this);
Volunteer = ko.mapping.toJS(koContext.$data); //plain js volunteer
Volunteer.index=koContext.$parent.EventVolunteers().indexOf(koContext.$data); //index of volunteer in member volunteer array
ko.applyBindings(ko.mapping.fromJS(Volunteer),$("#dialog-EditVolunteer")[0]); //bind new volunteer obj to dialog
До этого момента кажется, что все в порядке, нажатие кнопки «Сохранить» в диалоговом окне вызывает проблему.
var volunteer = ko.mapping.toJS(ko.contextFor(this).$data);
ko.mapping.fromJS(volunteer,{},ko.contextFor(currentTab).$data.EventVolunteers()[volunteer.index]);
В этот момент свойства обновляются в модели представления, но не в сетке на главном экране.
Похоже, что ko.mapping.fromJS заменяет наблюдаемое, а не обновляет его.