【问题标题】:How can I use ko.toJs method without computed properties in knockout mapping?如何在剔除映射中使用没有计算属性的 ko.toJs 方法?
【发布时间】:2012-07-26 15:52:56
【问题描述】:

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

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    如果您要将其转换为 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 时,formatted 将自然丢失,因为name 被转换为它的值。这是同样的示例:http://jsfiddle.net/rniemeyer/peEGG/。通常,当它是关于可观察对象的元数据(isValidisEditing 等)时,我会使用它。

    【讨论】:

    • 第三个选项救了我的命。我爱你,尼迈耶。
    • 类似于下面的 José Angel Yánez 回答,这里有一种方法可以使用上面第二个选项中的替换方法,但要创建一个 JSON 对象(如 ko.toJS):ko.toJS2 = function (model , replacer) { return JSON.parse(ko.toJSON(model, replacer)); }
    • 希望我早点知道第三个!谢谢你,尼迈耶。
    • 让我将我的名字添加到那些喜欢 sub-observable 的人的名单中。非常感谢。
    • 我知道我们不应该继续使用“我也是”cmets...但是选项 3 非常巧妙,以至于我自发地对我的同事说我“喜欢”瑞安尼迈耶。
    【解决方案2】:

    这也可以,它只会忽略其中包含“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)吗?
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2011-02-28
    • 2019-06-21
    • 2016-10-07
    相关资源
    最近更新 更多