我正在尝试异步发送一些数据作为单个对象。一半的数据来自我的KnockoutJS viewModel。另一半是我想要添加的一些数据。
我的想法是将它们都转换为JSON对象,然后使用数组.concat将它们放在一起。但这不起作用。你知道为什么吗?
我尝试了一些解决方案。第一种方法从JSON字符串构建对象,然后使用JSON.parse将它们作为对象。第二个尝试完全避免字符串。无论哪种方式,在我得到我的对象后,我尝试将它们连接在一起,但没有任何运气。
toAddString = '{"file": "thefile"}';
toAddObj = JSON.parse(toAddString);
koString = ko.toJSON(viewModel);
koObj = JSON.parse(koString,null,2);
finalObj = koObj.concat(toAddObj);
toAddObj = [{"file": "thefile"}];
koObj = ko.toJS(viewModel);
finalObj = koObj.concat(toAddObj);
toAddObj = new Object();
toAddObj.file = "one";
koObj = ko.toJS(viewModel);
finalObj = koObj.concat(toAddObj);
你知道这里可能出了什么问题吗?
我想要的只是一个对象,无论是数组还是JSON对象,它包含来自每个源的数据。
答案 0 :(得分:7)
尝试以下方法。我在猜测语法,因为我自己不使用Knockout,而且我使用ko.utils.extend()
函数将一个对象的属性复制到另一个对象上。
var toAddObj = { file: 'one' };
var koObj = ko.toJS(viewModel);
var finalObj = ko.utils.extend(toAddObj, koObj);
请注意,如果不使用var
,您始终会创建全局变量(通常是个坏主意)。
答案 1 :(得分:2)
检查变量的类型:
/* With Strings */
toAddString = '{"file": "thefile"}'; // a string
toAddObj = JSON.parse(toAddString); // an object
koString = ko.toJSON(viewModel); // a string containing JSON
koObj = JSON.parse(koString,null,2); // an object
// notice JSON.parse does only take one argument
finalObj = koObj.concat(toAddObj); // you're calling the array concat method?
/* With Objects */
toAddObj = [{"file": "thefile"}]; // an object (represented in code as literal)
koObj = ko.toJS(viewModel); // an object
finalObj = koObj.concat(toAddObj); // you're calling the array concat method?
/* With Objects (2) */
toAddObj = new Object(); // an object
toAddObj.file = "one"; // with a string property
koObj = ko.toJS(viewModel); // an object
finalObj = koObj.concat(toAddObj); // you're calling the array concat method?
因此,如果ko.toJS(viewModel)
返回一个不是数组的对象,您将获得大量"no method concat on …"
个异常。相反,你可以将它们都放入一个数组中:
[toAddObj, koObj] // and JSON.stringify that
或者您使用字符串构建过程并使用
"["+toAddString+","+koString+"]";
第一种方法更可取。