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第二个和第三个参数时,现在传递给JSON.stringify. 以下是有关参数的一些文档:https ://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify 。这意味着您可以将第二个参数 ( replacer) 与要包含的属性数组或处理键/值的函数一起传递。这是使用此技术的相同示例:http: //jsfiddle.net/rniemeyer/huyLe/

  3. 我经常使用的另一个选项是将 JSON 输出中不需要的计算值定义为子可观察值。Observables 是函数,它们是对象,因此您实际上可以在 observables 上定义 observables。像:

-

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

现在当转换为 JSON 时,formattedname随着转换为它的值而自然丢失。这是相同的示例:http: //jsfiddle.net/rniemeyer/peEGG/。通常,当它是关于可观察对象( , 等)的元数据时,我会使用isValidisEditing

于 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 回答