viewModel を Json オブジェクトに変換したい。しかし、計算されたプロパティをマップしたくありません。
2 に答える
JSON に変換する場合は、いくつかのオプションがあります。
オブジェクトにコンストラクター関数を使用している場合は、
.toJSON
関数をオーバーライドして、出力するプロパティを制御できます。これに関する記事は次のとおりです: http://www.knockmeout.net/2011/04/controlling-how-object-is-converted-to.html。サンプルは次のとおりです: http://jsfiddle.net/rniemeyer/FE4HX/。KO 2.1 では、使用時
ko.toJSON
に 2 番目と 3 番目の引数が に渡されるようになりましたJSON.stringify
。引数に関するドキュメントは次のとおりです: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify。replacer
これは、含めるプロパティの配列またはキー/値を処理する関数のいずれかで、2 番目の引数 ( ) を渡すことができることを意味します。この手法を使用した同じサンプルを次に示します: http://jsfiddle.net/rniemeyer/huyLe/。私が頻繁に使用するもう 1 つのオプションは、JSON 出力で不要な計算をサブオブザーバブルとして定義することです。オブザーバブルはオブジェクトである関数であるため、オブザーバブル上にオブザーバブルを実際に定義できます。お気に入り:
-
this.name = ko.observable("Bob");
this.name.formatted = ko.computed(...);
JSONに変換すると、その値に変換さformatted
れると自然に失われます。name
これも同じサンプルです: http://jsfiddle.net/rniemeyer/peEGG/ . isValid
通常、オブザーバブル ( 、isEditing
など) に関するメタデータである場合にこれを使用します。
これも機能します。「mappedProperties」が含まれているものはすべて無視されます。ダックタイプの否定論者は、ノックアウトを使用しているため、コードの一部としてmappedPropertiesを使用しないでください。したがって、動作するはずです。
/* Use this serializer function along with ko.toJS to produce clean JSON objects. */
ko.toJS2 = function (model)
{
return JSON.parse(ko.toJSON(model, modelSerializer));
}
function modelSerializer(key, value)
{
if (isSerializable(value))
return value;
else
return;
}
function isSerializable(object) {
if (object == null) return true;
if (typeof object == 'function') return false;
if (object.mappedProperties != null) return false;
return true;
}
使用法:
var goodLookingJson = ko.toJS2(whateverModel);