Как сохранить данные объекта 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), который сохранил старые данные, но совершенно не смог изменить их, поэтому для меня это было не лучшим решением.

Другие вопросы по тегам