0

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

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

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

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

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

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

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

提前谢谢了。

4

1 回答 1

2

这里发生了几件事:

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

调用ko.mapping.toJSON确实支持选项的第二个参数。{ ignore: ['child'] }你可以像这样的参数传入:http: //jsfiddle.net/rniemeyer/4kHC2/

于 2012-06-22T02:10:09.027 回答