【问题标题】:toJSON view model overrides not being reflected after Knockout unmappingtoJSON 视图模型覆盖在 Knockout 取消映射后未反映
【发布时间】:2012-06-24 06:44:59
【问题描述】:

我有一个来自服务器的深层对象图,我用一个 Knockout 视图模型结构表示它,它在每个级别省略了各种不必要的属性,但保留了基本层次结构。

我在两个方向都使用 Knockout 映射插件。在根以下的每个视图模型级别,当前视图模型的“构造器”接受其父视图模型作为参考,以及构建自身所需的原始数据部分。然后它会创建一组新的映射选项来创建自己的子项。

我创建了一个非常简化的小提琴来说明这一点:

http://jsfiddle.net/tqPtG/17/

在检索时我需要从服务器获取大量的只读元数据,但当我将图表以 JSON 形式发回时应该省略。我一直在每个级别使用 toJSON 原型方法来剔除我不需要的东西,这在某个时候工作得很好,但现在已经停止工作了。

在本地,似乎我的 toJSON 覆盖甚至没有触发(基于警报和控制台日志),但在这个小提琴中,它们确实触发了,但最终对象仍然包含已删除的属性“child”。我可以看到它已被 toJSON 方法删除,但在根取消映射后它仍然存在并显示在警报中。

那么,有两个问题 - 什么会导致我的 toJSON 覆盖不会在本地触发,我对简化小提琴中的取消映射逻辑的误解在哪里?

非常感谢。

【问题讨论】:

    标签: javascript knockout.js knockout-mapping-plugin


    【解决方案1】:

    这里发生了一些事情:

    • 您的toJSON 函数被调用,但不是ko.mapping.toJSON 调用的一部分。映射插件在确定对象的键时会进行字符串化。
    • ko.mapping.toJSON 创建对象的计划副本,此时它不再是 ParentViewModel 的实例。然后,当它对对象进行字符串化时,它将没有理由运行您的 toJSON 函数。

    ko.mapping.toJSON 的调用确实支持选项的第二个参数。您可以将{ ignore: ['child'] } 作为此参数传入,例如:http://jsfiddle.net/rniemeyer/4kHC2/

    【讨论】:

    • 谢谢瑞恩。我对在每个视图模型上使用 toJSON 方法的理解是,您有机会在相关位置为整个 JSON 的每个子组件实现自定义字符串化。感谢您提供关于额外参数的提示 - 但是我将如何为每个子级别指定忽略属性呢?例如,如果 ChildViewModel 上有我需要排除的属性。
    • ko.toJSON 通常是这样。看来ko.mapping.toJSON 处理它有点不同。因此,您可以使用 ko.toJSON 并删除 __ko_mapping__ 以及您不想要的任何其他属性。对于忽略数组,您可以指定要排除的属性名称,即使它们是嵌套的。唯一的问题是,如果您在不同级别具有相同的属性名称并且不想在所有级别都忽略。
    • 啊,太好了,谢谢 - 幸运的是,忽略列表对我来说非常有用。然而,我对未来的冲突有一种挥之不去的恐惧。如果 ko.mapping.toJSON 可以在执行其操作时查看单个属性的 toJSON 实现,那就太酷了。
    猜你喜欢
    • 2012-02-20
    • 2017-06-25
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多