视图模型有一个循环引用,按设计,使用<pre data-bind="text: ko.toJSON($data)"></pre>
进行调试抛出:
Unable to parse bindings.
Message: TypeError: Converting circular structure to JSON;
Bindings value: text: ko.toJSON($data)
有办法解决这个问题吗?
答案 0 :(得分:9)
JSON.stringify
内ko.toJSON
的调用最终导致您的错误。
您可以控制JSON输出的一种方法是在对象上提供toJSON
函数,如下所述:http://www.knockmeout.net/2011/04/controlling-how-object-is-converted-to.html。这样您就可以在适当的位置删除循环引用。
您也可以使用其他一些技术。
您可以将第二个参数传递给ko.toJSON
。这是replacer
的{{1}}选项,如下所述:
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify
例如,您可以传递一系列属性,包括:
JSON.stringify
您可以将不希望变为JSON的属性作为“sub” - 可观察对象附加:
ko.toJSON(myobject, ["one", "two", "three"])
在这种情况下,this.data = ko.observable();
this.data.parent = parent;
将变为data
,但JSON
将会消失,因为它是已被解包为其值的observable的属性。
答案 1 :(得分:0)
如果您打开添加对Dojo的引用(可能仅用于调试),则dojox.json.ref.toJson似乎能够使用循环引用序列化JSON对象。
在这种情况下,你可以这样做:
<pre data-bind="text: dojox.json.ref.toJson($data)"></pre>
还有一个值得检查的库可能提供比dojo更轻量级的解决方案:http://mixu.net/snapshot/