我有一个包含自定义事件的调度程序。在编辑事件弹出窗口中,有一个取消按钮。调度程序来自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之后,它仍然反映了所做的任何更改> :(。
答案 0 :(得分:1)
发现将数据克隆到字段e.sender.oldEventData会阻止它绑定到e.event。因此,e.event可能会在不弄乱旧数据的情况下发生变化。
这是通过简单的JSON.parse(JSON.stringify(e.event))实现的。
我尝试了Object.freeze(e.sender.oldEventData),它保留了旧数据,但完全无法修改,所以对我来说不是最好的解决方案。