避免视图中的循环值错误,淘汰赛

时间:2015-06-18 08:22:22

标签: javascript json knockout.js

我的淘汰赛模型(淘汰赛版本3.3.0)是这样的:

var Node=   function(id,name,parentNode) {
            var self = this;
            self.id= ko.observable(id);
            //more here...
            self.nodes = ko.observableArray([]);
            self.parentNode = parentNode;
        }

当此模型绑定到视图时,knockout会在控制台中抛出错误(非破坏错误):

  

TypeError:循环对象值

     

... m http://www.json.org/json2.js");返回   E.stringify(a.a.c(b)中,C,G)},ZC:功能(C ...

     

knockout-3.3.0.js(第20行,第344栏)

所以,我假设在内部,knockout调用JSON.stringify方法。 通过结合herehere的答案,我得出结论,如果我添加一个" toJSON"在我的模型中的方法,我排除" parentNode"属性,错误将消失。它有它。

我的toJSON功能:

self.toJSON = function(){
                    return {
                        id: self.id(),
                        name: self.name(),
                        //exclude parentNode
                        nodes: ko.toJSON(self.nodes())
                    };
                }

所以我的问题是:有没有更有效的方法来编写这个函数更通用?我想要包括所有(未知)属性,不包括一些(已知)属性。

在模型上调用ko.toJSON然后删除属性作为第一个链接建议因为循环引用而无法工作。那么还有其他选择吗?

编辑:绑定是由另一个ko插件进行的隐含调用,但它确实可以是任何东西。我已经设置了一个孤立的小提琴来演示问题,以及我的临时解决方案:http://jsfiddle.net/zq09znLa/1/

1 个答案:

答案 0 :(得分:1)

您可以使用替换器功能(请参阅solution here)排除不需要的密钥:

var excludeKeys = {
    parentNode: true
};

这有点尴尬,因为你必须暂时删除self.toJSON以避免无限递归。

self.toJSON = function () {
    var save = self.toJSON;
    delete self.toJSON;
    var result = ko.toJSON(self, function (key, value) {
        if (key in excludeKeys) return null;
        return value;
    });
    self.toJSON = save;
    return result;
};

我已经更新了您的小提琴,因此它在Chrome中运行并演示了解决方案: http://jsfiddle.net/zq09znLa/4/

更新:我已经在原型中将toJSON定义为空函数。它使程序成功运行(就具有预期的输出而言)只是使序列化无效。

Node.prototype = {
    toJSON: function () {}
};

我想让原型驻留toJSON起作用,但小提琴并不测试toJSON是否正在做正确的事情。

http://jsfiddle.net/2o7cnzL2/1/