我想将 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
第二个和第三个参数时,现在传递给JSON.stringify
. 以下是有关参数的一些文档:https ://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify 。这意味着您可以将第二个参数 (replacer
) 与要包含的属性数组或处理键/值的函数一起传递。这是使用此技术的相同示例:http: //jsfiddle.net/rniemeyer/huyLe/。我经常使用的另一个选项是将 JSON 输出中不需要的计算值定义为子可观察值。Observables 是函数,它们是对象,因此您实际上可以在 observables 上定义 observables。像:
-
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);