Javascript 剔除取消映射后未反映toJSON视图模型覆盖

Javascript 剔除取消映射后未反映toJSON视图模型覆盖,javascript,knockout.js,knockout-mapping-plugin,Javascript,Knockout.js,Knockout Mapping Plugin,我有一个来自服务器的深层对象图,我用一个淘汰视图模型结构来表示它,该结构省略了每个级别上各种不必要的属性,但保留了基本的层次结构 我在两个方向上都使用了Knockout映射插件。在根目录下的每个视图模型级别上,当前视图模型的“构造函数”接受其父视图模型作为参考,加上构建自身所需的原始数据部分。然后,它创建一组新的映射选项来创建自己的子级 我制作了一个高度简化的小提琴,它说明了这一点: 在检索时,我需要从服务器获取大量的只读元数据,但当我将图形作为JSON发回时,应该忽略这些元数据。我一直在每个

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

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

我制作了一个高度简化的小提琴,它说明了这一点:

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

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

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


非常感谢。

这里有几件事:

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

调用
ko.mapping.toJSON
确实支持选项的第二个参数。您可以将
{ignore:['child']}
作为如下参数传入:

谢谢Ryan。我对在每个视图模型上使用toJSON方法的理解是,您有机会在相关位置为整个JSON的每个子组件实现自定义字符串化。谢谢你给我的提示,这是一个额外的参数,但是我如何为每个子级别指定ignore属性呢?例如,如果ChildViewModel上有我需要排除的属性,这通常适用于
ko.toJSON
。似乎
ko.mapping.toJSON
对它的处理有点不同。因此,您可以使用
ko.toJSON
,只需删除
\uku\u映射\uuuu
以及您不需要的任何其他属性。对于ignore数组,可以指定要排除的属性名和属性名,即使它们是嵌套的。唯一的问题是,如果您在不同的级别上有相同的属性名称,并且不想在所有级别上忽略。啊,太好了,谢谢-幸运的是,忽略列表非常适合我。然而,我对未来的冲突有一种烦人的恐惧。如果ko.mapping.toJSON在做它的事情时可以查看各个属性的toJSON实现,那就太酷了。