Javascript 将嵌套的淘汰视图模型解析为JSON时遇到问题 问题

Javascript 将嵌套的淘汰视图模型解析为JSON时遇到问题 问题,javascript,jquery,knockout.js,viewmodel,knockout-2.0,Javascript,Jquery,Knockout.js,Viewmodel,Knockout 2.0,当我在工作和探索knockoutjs时,我被困在了某个地方。我想将viewmodel(和底层viewmodels)序列化为JSON。这将以无限循环结束,因为子viewmodels具有引用父viewmodel的属性。解决此问题的最佳做法是什么 代码 到目前为止我试过什么 我尝试在Partner viewmodel中添加以下方法: Partner.prototype.toJSON = function () { var copy = ko.toJS(self);

当我在工作和探索knockoutjs时,我被困在了某个地方。我想将viewmodel(和底层viewmodels)序列化为JSON。这将以无限循环结束,因为子viewmodels具有引用父viewmodel的属性。解决此问题的最佳做法是什么

代码 到目前为止我试过什么 我尝试在Partner viewmodel中添加以下方法:

Partner.prototype.toJSON = function () {
            var copy = ko.toJS(self);
            delete copy.parent;
            return copy;
        }

这只适用于一个合作伙伴,如果ProjectViewModel有多个合作伙伴,则每个合作伙伴都将具有与最后一个合作伙伴相同的值。只有当我想将其序列化为JSON时才会发生这种情况。

有几种方法可以处理这种情况。ko的
ko.toJS
部分正确地处理了这个问题。导致错误的最终原因是
ko.toJSON
中的
ko.toJS
之后调用的
JSON.stringify

原型上的
toJSON
方法非常接近,只是您希望处理
这个
而不是
self

所以,它看起来像:

Partner.prototype.toJSON = function() {
  var copy = ko.toJS(this);
  delete copy.parent;
  return copy; 
};
其他处理方法:

1-实际上不要将父对象存储在子对象上,而只是直接基于传递给构造函数的参数在任何处理程序中引用它

var Partner = function (parent) {
    var self = this;
    self.name = ko.observable(name);

    self.doSomething = function() {
        //can use "parent" directly here without storing it anywhere
    };
};
2-“隐藏”您的家长参考

var Partner = function (parent) {
    var self = this;
    self.meta = function() {};
    self.meta.parent = parent;
    self.name = ko.observable(name);    
};
您可以将您的
父项
值放在函数后面(可以作为可观察对象的子属性)。当您的结构被
ko.toJS
转换为普通JS对象时,函数的任何子属性都将丢失

3-根据需要更改应用程序的结构。假设父级希望在子级名称更改时作出反应。您可以传入回调,设置订阅,并在其更改时执行它

var Partner = function (nameChangedCallback) {
    var self = this;
    self.name = ko.observable(name);    

    if (typeof nameChangedCallback == "function") {
        self.name.subscribe(function() {
           nameChangedCallback.call(self, self);
        });
    }
};

由于这只是代码的简化版本,在原始版本上我有更多嵌套的viewmodels,更正toJSON解决了问题。谢谢!这个问题的原因完全是我自己的错。此外,如果我必须在没有KO的情况下编写当前的应用程序,我可能无法使其成为单个页面的应用程序代码至少要长5倍,也要复杂得多。你引起了我的好奇心……看,我制作了这个小型数据可视化应用程序,只处理5mb的原始数据和大约200个不同的视图组合(2个视图模式,3个标准可供选择,不同的选项取决于其他视图中选择的选项);我使用jquery手动构建了我的索引算法和事件,生成的脚本在ie6+中缩小了23kb,其余的都是如此;因此,对你来说,比ko大5倍的大小就像是缩小了200kb,就像我的应用程序*10=20查看模式或60选择模式一样,在一个页面中有2000个不同的查看组合……哇哦,太大了。
var Partner = function (nameChangedCallback) {
    var self = this;
    self.name = ko.observable(name);    

    if (typeof nameChangedCallback == "function") {
        self.name.subscribe(function() {
           nameChangedCallback.call(self, self);
        });
    }
};