我有一个实现树结构的Object(例如代表一个项目):
class Project
{
data: {};
children: Array<Project>=[];
}
我正在使用Primeng(TreeTable)中的角度组件来可视化这个树,并让用户动态更改树(添加子项,更改数据值,......)。
一切正常。但是当我使用http.post将我的对象发送到我的后端时,我得到一个错误(循环值...)。原因是来自primeng的组件向我的对象添加了额外的属性来管理树(父,扩展,...)。父母&#39;属性导致此循环值问题。
在打字稿中是否有办法将我的对象结构保存在我的应用程序的上下文中? (组件添加的属性对我的代码不可见,因此在使用http.post时会被忽略)
在http.post函数中,我的对象必须更改为json或string。是否有可能覆盖避免此错误的方法? (像rails中的.as_json)
谢谢, 迈克尔
答案 0 :(得分:0)
通常这是由循环结构引起的...例如,这很好:
class Project
{
data: {};
children: Array<Project>=[];
}
const project = new Project();
project.children.push(new Project());
console.log(JSON.stringify(project));
但是,如果你要向自己或其中一个孩子添加一个物体......随之而来的是混乱.......
class Project
{
data: {};
children: Array<Project>=[];
}
const project = new Project();
project.children.push(new Project());
// No problem
console.log(JSON.stringify(project));
project.children.push(project);
// No end!
console.log(JSON.stringify(project));
这是一个非常有效的内存结构 - 引用在圈子中出现但最终可能。
当你尝试序列化它时,它每次遇到原始项目时都永远不会达到目的,它将继续循环而不会结束。
您需要映射到非循环类型以序列化数据。您可以使用以下数据丢失来执行此操作:
class Project
{
data: { example: '4'};
children: Array<Project>=[];
}
const project = new Project();
project.children.push(new Project());
console.log(JSON.stringify(project));
project.children.push(project);
const getCircularReplacer = () => {
const seen = new WeakSet;
return (key, value) => {
if (typeof value === "object" && value !== null) {
if (seen.has(value)) {
return;
}
seen.add(value);
}
return value;
};
};
JSON.stringify(project, getCircularReplacer());
答案 1 :(得分:0)
我为我的问题找到了解决方案。我为组件提供了我的树结构的副本,但引用了原始数据哈希。每当我更改树结构(添加节点,删除节点等)时,我都会重新计算一棵干净的树。
工作 - 解决问题。