[英]Remove selected node from Tree
我正在使用angular-tree-component( https://angular2-tree.readme.io )在Angular2应用程序中显示一棵树。
我需要使用户能够选择树中的任何节点并将其删除。 这应该删除选定的节点及其所有子节点(如果是叶节点,则只是该节点)。 用户完成后,修剪后的树将发送到服务器并保存在服务器中。
在下面的示例中,用户选择“节点1-2”,然后单击“删除”。 这将从视图和已更新的底层Javascript对象中删除“节点1-2,节点1”和“节点2”。 然后,用户可以单击另一个按钮(例如,保存)以将更新的对象保存在服务器上。
为了做到这一点,我编写了以下代码,单击“删除”按钮即可调用该代码。 我存储选定节点的ID,然后遍历整个树以找到该ID。 当id匹配时,我使用'delete'关键字删除'id'和'text'。 但是,“删除儿童”无效。
deleteSelectedNode() {
//Get the node which was selected by the user
let nodeToDelete: TreeNode = this.myService.getActiveNode();
//id will be unique, can be used to identify the node
let idToDelete = nodeToDelete.data.id;
this.traverseTree(this.nodes[0], idToDelete);
}
traverseTree(obj, idToDelete: string) {
for (var k in obj) {
if (typeof obj[k] == "object" && obj[k] !== null) {
this.traverseTree(obj[k], idToDelete);
}
else {
if (k === 'id') {
let id = obj[k];
if (id === idToDelete) {
console.log('ID Matched ' + id);
delete obj['id'];
delete obj['text'];
delete obj['children'];
break;
}
}
}
}
}
下面是呈现树的JSON。
{
"children": [
{
"children": [
{
"text": "Node 1",
"id": "A493"
},
{
"text": "Node 2",
"id": "A494"
}
],
"text": "Node 1-2",
"id": "A491"
},
{
"children": [
{
"children": [
{
"text": "Node 3",
"id": "A5ab"
},
{
"text": "Node 4",
"id": "A5ac"
},
{
"text": "Node 5",
"id": "A5ad"
},
{
"text": "Node 6",
"id": "A5ae"
},
{
"text": "Node 7",
"id": "A5af"
},
{
"text": "Node 8",
"id": "A5b0"
},
{
"text": "Node 9",
"id": "A5b1"
},
{
"text": "Node 10",
"id": "A5b2"
},
{
"text": "Node 11",
"id": "A5b3"
},
{
"text": "Node 12",
"id": "A5b4"
},
{
"text": "Node 13",
"id": "A6da"
},
{
"text": "Node 14",
"id": "A6db"
}
],
"text": "Node 1-14",
"id": "A495"
},
{
"children": [
{
"text": "Node 15",
"id": "A6dc"
},
{
"text": "Node 16",
"id": "A6dd"
},
{
"text": "Node 17",
"id": "A6de"
},
{
"text": "Node 18",
"id": "A6df"
},
{
"text": "Node 19",
"id": "A6e0"
},
{
"text": "Node 20",
"id": "A6e1"
},
{
"text": "Node 21",
"id": "A6e2"
},
{
"text": "Node 22",
"id": "A6e3"
}
],
"text": "Node 15-22",
"id": "A496"
},
{
"text": "Node 23",
"id": "A497"
},
{
"text": "Node 24",
"id": "A498"
}
],
"text": "Node 23-24",
"id": "A492"
}
],
"text": "Node 1-24",
"id": "A490"
}
如何删除整个节点,包括子节点? 另外,有没有更好的方法可以做到这一点?
您可以通过父级引用轻松完成
deleteNode() {
let nodeToDelete: TreeNode = this.tree.treeModel.getActiveNode();
if (nodeToDelete.level === 1) {
this.nodes = this.nodes.filter((n) => n.id !== nodeToDelete.id);
} else {
nodeToDelete.parent.children = nodeToDelete.parent.children.filter((n) => n.id !== nodeToDelete.id);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.