在Knockout取消映射后,toJSON视图模型覆盖未被反映

时间:2012-06-21 23:22:43

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

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

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

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

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

我需要从服务器上检索很多重的元数据,但是当我将图形作为JSON发布时应该省略。我一直在每个级别使用toJSON原型方法来剔除我不需要的东西,这在某一点上工作得非常漂亮但现在已经停止工作了。

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

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

非常感谢提前。

1 个答案:

答案 0 :(得分:2)

这里有几件事情要发生:

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

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