【发布时间】:2015-09-03 18:43:41
【问题描述】:
我的淘汰赛模型(淘汰赛 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;
}
当这个模型被绑定到一个视图时,敲除在控制台中抛出一个错误(非破坏性错误):
TypeError: 循环对象值
...m http://www.json.org/json2.js");返回 E.stringify(a.a.c(b),c,g)},zc:function(c...
knockout-3.3.0.js(第 20 行,第 344 列)
所以,我假设在内部某个地方,敲除调用 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,然后按照第一个链接的建议删除属性是行不通的,因为循环引用。那么还有其他选择吗?
编辑: 绑定时隐含的对 JSON 的调用是由另一个 ko 插件进行的,但它实际上可以是任何东西。我已经设置了一个孤立的小提琴来演示这个问题,以及我在这里的临时解决方案:http://jsfiddle.net/zq09znLa/1/
【问题讨论】:
-
在jsfiddle.net/LkqTU/24754 处查看工作示例。让我知道干杯
-
@supercool 抱歉,您的回答与我的问题无关。查看我的编辑,我添加了一个可重现的小提琴。
-
通过 id 在字典中注册节点,然后将节点存储为 id 数组,并计算以生成实际的节点列表。同样,存储父节点 ID 并计算(如果需要)来获取节点本身。
-
您的示例中的小提琴不起作用(至少在 Chrome 中不起作用),KoLite 未加载,因为未设置服务器响应 MIME 类型(来自 raw.github.com)
-
@Tyblitz 小提琴不应该工作:查看控制台错误和小提琴 cmets。如果您注释掉相应的部分,它将起作用。也在 chrome 上测试过。
标签: javascript json knockout.js