【发布时间】:2012-07-26 15:52:56
【问题描述】:
我想将 viewModel 转换为 Json 对象。但我不想映射计算属性。
【问题讨论】:
标签: knockout.js
我想将 viewModel 转换为 Json 对象。但我不想映射计算属性。
【问题讨论】:
标签: knockout.js
如果您要将其转换为 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);
【讨论】:
ko.toJS2 函数返回纯 JavaScript 对象,而不是 JSON 字符串,对吗?你会去掉 JSON.parse 调用来创建一个ko.toJSON2(或者我称之为ko.toCleanJSON)吗?