5

一部のデータを単一のオブジェクトとして非同期に送信しようとしています。データの半分は私のKnockoutJSviewModelから来ています。残りの半分は、それに追加したいデータです。

私の考えは、両方をJSONオブジェクトに変換してから、配列.concatを使用してそれらをまとめることでした。しかし、これは機能していません。理由をご存知ですか?

私はいくつかの解決策を試しました。最初のメソッドは、JSON文字列からオブジェクトを構築し、JSON.parseを使用してそれらをオブジェクトとして配置します。2つ目は、文字列を完全に回避しようとします。いずれにせよ、オブジェクトを取得した後、それらを連結しようとしますが、運がありません。

文字列付き

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 に答える