我有一个来自服务器的深层对象图,我用Knockout视图模型结构表示,它在每个级别省略了各种不必要的属性,但保留了基本层次结构。
我正在两个方向上使用Knockout映射插件。在根目录下的每个视图模型级别,当前视图模型的“构造函数”接受其父视图模型作为参考,以及构造自身所需的原始数据部分。然后,它会创建一组新的映射选项来创建自己的子项。
我创造了一个非常简化的小提琴,说明了这一点:
我需要从服务器上检索很多重的元数据,但是当我将图形作为JSON发布时应该省略。我一直在每个级别使用toJSON原型方法来剔除我不需要的东西,这在某一点上工作得非常漂亮但现在已经停止工作了。
在本地,似乎我的toJSON覆盖甚至不会触发(基于警报和控制台日志),但在这个小提琴中,它们会触发,但最终对象仍包含已删除的属性“child”。我可以看到它被toJSON方法删除但在根取消映射后它仍然存在并显示在警报中。
所以,2个问题 - 什么会导致我的toJSON覆盖不在本地触发,以及我对简化小提琴中的取消映射逻辑的误解在哪里?
非常感谢提前。
答案 0 :(得分:2)
这里有几件事情要发生:
toJSON
函数被调用,但不是ko.mapping.toJSON
调用的一部分。映射插件在确定对象的键时执行字符串化。ko.mapping.toJSON
创建对象的计划副本,此时它不再是ParentViewModel
的实例。然后,当它对对象进行字符串化时,它没有理由运行toJSON
函数。对ko.mapping.toJSON
的调用确实支持选项的第二个参数。您可以将{ ignore: ['child'] }
作为此参数传递,例如:http://jsfiddle.net/rniemeyer/4kHC2/