如何在淘汰映射中使用没有计算属性的ko.toJs方法?

ozz*_*ozz 15 knockout.js

我想将viewModel转换为Json对象.但我不想映射计算属性.

RP *_*yer 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上实际定义observable.喜欢:

-

this.name = ko.observable("Bob");
this.name.formatted = ko.computed(...);
Run Code Online (Sandbox Code Playgroud)

现在转换为JSON时,formatted自然会因为name转换为其值而丢失.以下是同样的示例:http://jsfiddle.net/rniemeyer/peEGG/.通常我用这个当它是大约可观测(元数据isValid,isEditing等等).

  • 我喜欢第三个选项:) (5认同)
  • 第三个选项救了我的屁股.我爱你,尼迈耶. (3认同)
  • 我知道我们不应该用"我也是"评论......但是选项#3是如此光滑,以至于我自发地向我的同事说我"心脏"Ryan Niemeyer. (2认同)

小智 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;
}
Run Code Online (Sandbox Code Playgroud)

用法:

var goodLookingJson = ko.toJS2(whateverModel);
Run Code Online (Sandbox Code Playgroud)