修改第 2 个 window 中的 JSON 会修改第一个 window 中的原始 JSON
Modifying JSON in 2nd window modifies the original JSON in 1st window
我有两个windows。在第一个 window 中,我有以下 JSON。我使用 Alloy.createController("set_schedule", {"data" : data}) 将此 JSON 从第一个 window 传递到第二个 window。在 2nd window 中,我将数据推送到插槽,它正在修改 1st window 的原始 JOSN。我不想要这个。它不应修改原始数据。我尝试将 args.data 存储到局部变量然后进行操作,但没有任何效果。
schedule.js
var data = [{
"day" : "monday",
"slots" : [],
"duration" : 0
}, {
"day" : "tuesday",
"slots" : [],
"duration" : 0
}, {
"day" : "wednesday",
"slots" : [],
"duration" : 0
}, {
"day" : "thursday",
"slots" : [],
"duration" : 0
}, {
"day" : "friday",
"slots" : [],
"duration" : 0
}, {
"day" : "saturday",
"slots" : [],
"duration" : 0
}, {
"day" : "sunday",
"slots" : [],
"duration" : 0
}]
var win = Alloy.createController("set_schedule", {
"data" : data
}).getView("setSchedule");
win.open();
set_schedule.js
var scheduleData = args.data; //copy to local variable
scheduleData[0].slots.push({"start": "09:00:00",
"finish": "17:00:00"});
现在我关闭 set_schedule window 并返回时间表 window 它正在显示
var data = [{
"day" : "monday",
"slots" : [{"start": "09:00:00",
"finish": "17:00:00"}],
"duration" : 0
}, {
"day" : "tuesday",
"slots" : [],
"duration" : 0
}, {
"day" : "wednesday",
"slots" : [],
"duration" : 0
}, {
"day" : "thursday",
"slots" : [],
"duration" : 0
}, {
"day" : "friday",
"slots" : [],
"duration" : 0
}, {
"day" : "saturday",
"slots" : [],
"duration" : 0
}, {
"day" : "sunday",
"slots" : [],
"duration" : 0
}]
可能的解决方案是在将 JSON 传递给第二个 window 时对其进行字符串化,然后在另一侧对其进行解析。这将确保它不是您正在操作的同一个对象。
您的代码似乎正在创建一种情况,其中存在有效的 ByRef 参数调用(发送对象的引用而不是 JSON 对象本身)。
您传递的对象是 byref,因为它是一个对象。你应该做的是将该对象克隆到一个新的 json 对象:
var newJsonObj = JSON.parse(JSON.stringify(data));
注意 - 它可能不是最适合您的解决方案(我只是不知道您的业务逻辑是什么)。
我有两个windows。在第一个 window 中,我有以下 JSON。我使用 Alloy.createController("set_schedule", {"data" : data}) 将此 JSON 从第一个 window 传递到第二个 window。在 2nd window 中,我将数据推送到插槽,它正在修改 1st window 的原始 JOSN。我不想要这个。它不应修改原始数据。我尝试将 args.data 存储到局部变量然后进行操作,但没有任何效果。
schedule.js
var data = [{
"day" : "monday",
"slots" : [],
"duration" : 0
}, {
"day" : "tuesday",
"slots" : [],
"duration" : 0
}, {
"day" : "wednesday",
"slots" : [],
"duration" : 0
}, {
"day" : "thursday",
"slots" : [],
"duration" : 0
}, {
"day" : "friday",
"slots" : [],
"duration" : 0
}, {
"day" : "saturday",
"slots" : [],
"duration" : 0
}, {
"day" : "sunday",
"slots" : [],
"duration" : 0
}]
var win = Alloy.createController("set_schedule", {
"data" : data
}).getView("setSchedule");
win.open();
set_schedule.js
var scheduleData = args.data; //copy to local variable
scheduleData[0].slots.push({"start": "09:00:00",
"finish": "17:00:00"});
现在我关闭 set_schedule window 并返回时间表 window 它正在显示
var data = [{
"day" : "monday",
"slots" : [{"start": "09:00:00",
"finish": "17:00:00"}],
"duration" : 0
}, {
"day" : "tuesday",
"slots" : [],
"duration" : 0
}, {
"day" : "wednesday",
"slots" : [],
"duration" : 0
}, {
"day" : "thursday",
"slots" : [],
"duration" : 0
}, {
"day" : "friday",
"slots" : [],
"duration" : 0
}, {
"day" : "saturday",
"slots" : [],
"duration" : 0
}, {
"day" : "sunday",
"slots" : [],
"duration" : 0
}]
可能的解决方案是在将 JSON 传递给第二个 window 时对其进行字符串化,然后在另一侧对其进行解析。这将确保它不是您正在操作的同一个对象。
您的代码似乎正在创建一种情况,其中存在有效的 ByRef 参数调用(发送对象的引用而不是 JSON 对象本身)。
您传递的对象是 byref,因为它是一个对象。你应该做的是将该对象克隆到一个新的 json 对象:
var newJsonObj = JSON.parse(JSON.stringify(data));
注意 - 它可能不是最适合您的解决方案(我只是不知道您的业务逻辑是什么)。