Как сохранить данные объекта JS после того, как объект, который вы задали, изменился?
У меня есть планировщик с пользовательскими событиями. Во всплывающем окне редактирования есть кнопка отмены. Планировщик из библиотеки javascript, поэтому я не создал его, а создал только его пользовательские функции.
Поэтому во всплывающем окне редактирования (которое вызывает событие редактирования) я установил переменную для хранения текущего состояния данных события. Затем, если я внесу какие-либо изменения и нажму "Отмена" вместо "Сохранить", запускается событие "Отмена". В событии отмены данные события currentState теперь меняются на новое состояние всех измененных данных, что мне не нужно. Мне нужны старые данные, чтобы я мог вернуть все обратно, а затем обновить планировщик.
Это мое событие отмены:
cancel: function(e){
console.log('Cancelling', e);
var kendoEvent = new kendo.data.SchedulerEvent();
var schema = e.sender.dataSource.options.schema.model.fields;
console.log(e.sender.dataSource.hasChanges());
console.log(currentEventState);
$.each(schema, function(index, value){
//console.log(value);
console.log(index);
kendoEvent[index] = e.sender.oldEventData[index];
if(index == 'ownerId'){
kendoEvent.ownerId = currentEventState.ownerId[0].value;
}
});
console.log(kendoEvent);
console.log(getIndexById(kendoEvent.taskId));
eventData[getIndexById(kendoEvent.taskId)] = kendoEvent;
e.sender.dataSource.read();
if(e.event.id != '0'){
dontUpdate = 1;
//e.sender.dataSource.sync();
}
},
Где e.sender - планировщик, а e.event - данные события (со всеми внесенными изменениями). В событии редактирования первое, что я делаю, это добавляю поле oldEventData в e.sender и присваиваем ему значение e.event. Но... если в e.event внесены изменения ПОСЛЕ e.sender.oldEventData, e.sender.oldEventData ВСЕ ЕЩЕ изменяется, чтобы отразить все сделанные изменения...
Как я могу сохранить эти старые данные, чтобы я мог вернуть их обратно? Я попытался просто сделать глобальную переменную вместо создания нового поля в e.sender, но после установки глобальной переменной на e.event, она по-прежнему отражала любые изменения, сделанные>:(.
1 ответ
Обнаружено, что клонирование данных в поле e.sender.oldEventData не позволяет связать их с e.event. Так что e.event может измениться, не связываясь со старыми данными.
Это было достигнуто с помощью простого JSON.parse(JSON.stringify(e.event)).
Я попытался использовать Object.freeze(e.sender.oldEventData), который сохранил старые данные, но совершенно не смог изменить их, поэтому для меня это было не лучшим решением.