在第二个窗口中修改JSON会在第一个窗口中修改原始JSON

时间:2016-01-20 14:42:17

标签: appcelerator titanium-mobile titanium-alloy

我有两个窗户。在第一个窗口中,我有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
}] 

2 个答案:

答案 0 :(得分:3)

您传递的对象是byref,因为它是一个对象。你应该做的是将该对象克隆到一个新的json对象:

var newJsonObj = JSON.parse(JSON.stringify(data));

注意 - 它可能不适合您(我只是不知道您的业务逻辑是什么)。

答案 1 :(得分:0)

当您将JSON传递给第二个窗口然后在另一侧解析时,可能的解决方案是将JSON字符串化。这将确保它与您操作的对象不同。

您的代码似乎正在创建一个有效的ByRef参数调用的情况(发送对象的引用而不是JSON对象本身)。