我有两个窗户。在第一个窗口中,我有JSON以下。我使用Alloy.createController(“set_schedule”,{“data”:data})将此JSON从第一个窗口传递到第二个窗口。在第二个窗口我将数据推送到插槽,它正在修改第一个窗口的原始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窗口并回到它正在显示的计划窗口
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
}]
答案 0 :(得分:3)
您传递的对象是byref,因为它是一个对象。你应该做的是将该对象克隆到一个新的json对象:
var newJsonObj = JSON.parse(JSON.stringify(data));
注意 - 它可能不适合您(我只是不知道您的业务逻辑是什么)。
答案 1 :(得分:0)
当您将JSON传递给第二个窗口然后在另一侧解析时,可能的解决方案是将JSON字符串化。这将确保它与您操作的对象不同。
您的代码似乎正在创建一个有效的ByRef参数调用的情况(发送对象的引用而不是JSON对象本身)。