如何在您设置的对象更改后保留JS对象数据?

时间:2017-03-31 16:31:32

标签: javascript jquery kendo-scheduler

我有一个包含自定义事件的调度程序。在编辑事件弹出窗口中,有一个取消按钮。调度程序来自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.sender.oldEventData之后对e.event进行了更改,则会更改e.sender.oldEventData STILL以反映所做的所有更改...

我如何保留这些旧数据,以便将其还原?我尝试只做一个全局变量,而不是在e.sender中创建一个新字段,但在将全局变量设置为e.event之后,它仍然反映了所做的任何更改> :(。

1 个答案:

答案 0 :(得分:1)

发现将数据克隆到字段e.sender.oldEventData会阻止它绑定到e.event。因此,e.event可能会在不弄乱旧数据的情况下发生变化。

这是通过简单的JSON.parse(JSON.stringify(e.event))实现的。

我尝试了Object.freeze(e.sender.oldEventData),它保留了旧数据,但完全无法修改,所以对我来说不是最好的解决方案。