15

viewModel を Json オブジェクトに変換したい。しかし、計算されたプロパティをマップしたくありません。

4

2 に答える 2

37

JSON に変換する場合は、いくつかのオプションがあります。

  1. オブジェクトにコンストラクター関数を使用している場合は、.toJSON関数をオーバーライドして、出力するプロパティを制御できます。これに関する記事は次のとおりです: http://www.knockmeout.net/2011/04/controlling-how-object-is-converted-to.html。サンプルは次のとおりです: http://jsfiddle.net/rniemeyer/FE4HX/

  2. KO 2.1 では、使用時ko.toJSONに 2 番目と 3 番目の引数が に渡されるようになりましたJSON.stringify。引数に関するドキュメントは次のとおりです: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringifyreplacerこれは、含めるプロパティの配列またはキー/値を処理する関数のいずれかで、2 番目の引数 ( ) を渡すことができることを意味します。この手法を使用した同じサンプルを次に示します: http://jsfiddle.net/rniemeyer/huyLe/

  3. 私が頻繁に使用するもう 1 つのオプションは、JSON 出力で不要な計算をサブオブザーバブルとして定義することです。オブザーバブルはオブジェクトである関数であるため、オブザーバブル上にオブザーバブルを実際に定義できます。お気に入り:

-

this.name = ko.observable("Bob");
this.name.formatted = ko.computed(...);

JSONに変換すると、その値に変換さformattedれると自然に失われます。nameこれも同じサンプルです: http://jsfiddle.net/rniemeyer/peEGG/ . isValid通常、オブザーバブル ( 、isEditingなど) に関するメタデータである場合にこれを使用します。

于 2012-07-27T01:38:11.633 に答える
7

これも機能します。「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);
于 2013-03-27T00:22:00.080 に答える