gpt4 book ai didi

javascript - 当你设置的对象发生变化后,如何保留JS对象数据?

转载 作者:太空宇宙 更新时间:2023-11-04 15:50:37 26 4
gpt4 key购买 nike

我有一个带有自定义事件的调度程序。在编辑事件弹出窗口中,有一个取消按钮。调度程序来自 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 仍然会发生更改以反射(reflect)所做的所有更改...

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

最佳答案

发现将数据克隆到字段 e.sender.oldEventData 可以防止其与 e.event 绑定(bind)。因此 e.event 可以在不弄乱旧数据的情况下进行更改。

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

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

关于javascript - 当你设置的对象发生变化后,如何保留JS对象数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43145581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com