我的淘汰赛模型(淘汰赛版本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方法。 通过结合here和here的答案,我得出结论,如果我添加一个" 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/
答案 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是否正在做正确的事情。