gpt4 book ai didi

javascript - 避免 View 、 knockout 中循环值的误差

转载 作者:行者123 更新时间:2023-12-03 09:49:47 25 4
gpt4 key购买 nike

我的 knockout 模型( knockout 的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;
}

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

TypeError: cyclic object value

...m http://www.json.org/json2.js");return E.stringify(a.a.c(b),c,g)},zc:function(c...

knockout-3.3.0.js (line 20, col 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 然后按照第一个链接的建议删除属性将不起作用。那么还有其他选择吗?

编辑:绑定(bind)时隐含的对JSON的调用是由另一个ko插件进行的,但它实际上可以是任何东西。我设置了一个独立的 fiddle 来演示问题和我的临时解决方案:http://jsfiddle.net/zq09znLa/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;
};

我已经更新了你的 fiddle ,因此它可以在 Chrome 中运行并演示解决方案: http://jsfiddle.net/zq09znLa/4/

更新:我制作了一个版本,其中 toJSON 在原型(prototype)中定义为空函数。它通过使序列化无效来使程序成功运行(就具有预期输出而言)。

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

我想制作一个可以工作的原型(prototype)toJSON,但是 fiddle 并没有测试toJSON是否正在做正确的事情。

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

关于javascript - 避免 View 、 knockout 中循环值的误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30910081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com