简体   繁体   English

如果至少选择了一个子元素,如何更改父元素的属性?

[英]How to change property of parent element if at least one child selected?

I have a tree of nodes of type LayerNode .我有一棵LayerNode类型的节点树。 Where each node as children and parent reference.其中每个节点作为子节点和父节点的引用。

I try to change property of parent if at least one child element has property selected = true .如果至少一个子元素具有属性selected = true ,我会尝试更改父元素的属性。

  public recursiveSelectLayers(node: LayerNode) {
    if (node.children)
      node.children.forEach((childNode: LayerNode) => {
        childNode.parent = node;

        if (childNode?.parent?.selected)
          childNode.selected = childNode.parent.selected;

        if (childNode.selected && childNode.parent)
          childNode.parent.selected = childNode.selected;

        this.recursiveSelectLayers(childNode);
      });
  }

At the same time if parent is selected I need to set selected for all immediate children.同时,如果selected了父母,我需要为所有直系子女设置selected

Problem is if one of children has selected the function above selects all children from last children to the root.问题是,如果其中一个孩子selected了上面的函数,则选择从最后一个孩子到根的所有孩子。

My second attempt:我的第二次尝试:

  public recursiveSelectLayers(node: LayerNode) {
    if (node.parent && node.selected) node.parent.selected = node.selected;

    if (node.children) {
      node.children.forEach((childNode: LayerNode) => {
        if (node?.selected) childNode.selected = node.selected;
        childNode.parent = node;
        this.recursiveSelectLayers(childNode);
      });
    }
  }

Case 1:情况1:

Parent 1 (selected)
   Child 1
   Child 2
   Child 3 (selected)

Case 2:案例二:

   Parent 1 (selected)
       Child 1 (selected)
       Child 2 (selected)
       Child 3 (selected)

Case 3:案例3:

   Parent 1 (selected)
       Child 1
       Child 2
       Child 3 (selected)
           Child 3.1 (selected)

Editing:编辑:

  public recursiveSelectLayers(node: LayerNode) {
    if (node.id) this.flatlayers.set(node.id, node);
    if (node.children) {
      node.children.forEach(this.recursiveSelectLayers, this);
      node.selected =
        [...node.children].some((node) => node.selected) ||
        node?.parent?.selected;
    }
  }

I try this... but I'm testing it.我试试这个......但我正在测试它。 Passed 4 cases.通过4例。

 function recursiveSelectLayers(node) { if (node.children) { node.children.forEach((childNode) => { if (node.parent && node.selected) { node.parent.selected = true; } recursiveSelectLayers(childNode); }); } if (node.parent && node.parent.selected) { node.selected = true; } return node } // tests: var case1 = { selected: true, children: [{}, {}, { selected: true }] } case1.children[0].parent = case1; case1.children[1].parent = case1; case1.children[2].parent = case1; var case2 = { selected: true, children: [{ selected: true }, { selected: true }, { selected: true }] } case2.children[0].parent = case2; case2.children[1].parent = case2; case2.children[2].parent = case2; var case3 = { selected: true, children: [{}, {}, { selected: true, children: [{ selected: true }] }] } case3.children[0].parent = case3; case3.children[1].parent = case3; case3.children[2].parent = case3; case3.children[2].children[0].parent = case3.children[2]; var case4 = { children: [{}, {}, { selected: true, children: [{}] }] } case4.children[0].parent = case4; case4.children[1].parent = case4; case4.children[2].parent = case4; case4.children[2].children[0].parent = case4.children[2]; console.log(recursiveSelectLayers(case1)) console.log(recursiveSelectLayers(case2)) console.log(recursiveSelectLayers(case3)) console.log(recursiveSelectLayers(case4))
 <pre> Case1: Parent 1 (selected) Child 1 Child 2 Child 3 (selected) Case 2: Parent 1 (selected) Child 1 (selected) Child 2 (selected) Child 3 (selected) Case 3: Parent 1 (selected) Child 1 Child 2 Child 3 (selected) Child 3.1 (selected) Case 4: Parent 1 Child 1 Child 2 Child 3 (selected) Child 3.1 </pre>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何知道所选子元素相对于其父元素的订单号? - How to know the order number of the child element selected in relation to its parent? 如何在树中选择父元素而不丢失孩子的“选定”样式 - How to select a parent element in tree and not lose child's 'selected' styles 如何在不影响父元素的情况下设置子元素的 contenteditable 属性? - How to set child's contenteditable property without affecting the parent element? 如何将属性/ styles 添加到 angular 中父元素内的子节点 - How to add a property/ styles to child nodes inside a parent element in angular 如何在父可滚动元素中逐个滚动子元素? - How to scroll child elements one by one in parent scrollable element? CSS 关注子元素更改父元素 - CSS focus on child element change a parent element 如何使用javascript改变他的孩子的父元素属性? - How to change parent element properties by his child using javascript? 悬停其父母时如何更改子元素的不透明度 - How to change opacity of child-element when hovering his parent Select2(多项选择)-如果已经选择了至少一个元素,如何显示替代占位符? - Select2 (multiple selection) - how to display alternative placeholder if at least one element has been selected already? 如何要求至少选择一个复选框 - How to require at least one checkbox to be selected
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM