我想将viewModel转换为Json对象。但我不想映射计算属性。
答案 0 :(得分:37)
如果您要将其转换为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上实际定义observable。像:
-
this.name = ko.observable("Bob");
this.name.formatted = ko.computed(...);
现在转换为JSON时,formatted
会自然丢失,因为name
会转换为其值。这是同样的样本:http://jsfiddle.net/rniemeyer/peEGG/。通常我会在它是关于可观察的元数据(isValid
,isEditing
等)时使用它。
答案 1 :(得分:7)
这也可以,它只会忽略任何带有'mappedProperties'的东西,对于duck-type反对者来说,记住你不应该将mappedProperties作为代码的一部分,因为你正在使用knockout。因此它应该有用。
/* 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);