5

我正在尝试将一些数据作为单个对象异步发送。一半的数据来自我的 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);

与对象 (2)

toAddObj = new Object();
toAddObj.file = "one";

koObj = ko.toJS(viewModel);

finalObj = koObj.concat(toAddObj);

你知道这里可能出了什么问题吗?

我想要的只是一个对象,无论是数组还是 JSON 对象,它都包含来自这些源中的每一个的数据。

4

2 回答 2

7

试试下面的。我在猜测语法,因为我自己不使用 Knockout,并且我正在使用该ko.utils.extend()函数将一个对象的属性复制到另一个对象上。

var toAddObj = { file: 'one' };

var koObj = ko.toJS(viewModel);

var finalObj = ko.utils.extend(toAddObj, koObj);

请注意,如果不使用var,您总是会创建全局变量(通常是个坏主意)。

于 2012-12-20T00:48:05.527 回答
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+"]";

其中第一种方法更可取。

于 2012-12-20T00:47:27.477 回答