javascript - 带有 Angular 6 的第 n 个子项的层次结构下拉列表。我希望选择父复选框需要隐藏所有子复选框

标签 javascript html angular angular6

第 n 个子项的层次结构下拉列表的 Angular 为 6。我希望选择父复选框需要隐藏所有子复选框。我已经尝试到第 3 级。但我需要达到第 n 级请帮助我。我的代码。

应用程序组件.ts

persons : any=[
  {Id:1 , Name: 'Ram',checked:false, disable:false,
   children:[{Id:1, Name: 'shyam', checked:false, disable:false, RID:1,
  children:[{Id:1, Name: 'shyam1',checked:false, disable:false,  RID:1, 
  children :[{Id:1, Name: 'Rambabu2', checked:false, disable:false,RID:1, 
  children:[{Id:1, Name: 'shyam1',checked:false, disable:false,RID:1}]}]}]},
   {Id:2, Name: 'Kumar',checked:false, disable:false, RID:1, children:[{Id:1, Name: 'shyam',checked:false, disable:false,RID:1,}]},
    {Id:3, Name: 'shyam3',checked:false, disable:false,RID:1,}]}
  ]



parentCheckbox(ev: any, node: any) {
  debugger;
  
  if (ev.target.checked) {
    this.disableAllChild(node)
  } else {
  }
}
disableAllChild(node: any) {
  debugger

  
  node?.children?.forEach((element:any) => {
    ;(element.checked = false), (element.disable = true)
    element?.children?.forEach((el:any) => {
      ;(el.checked = false), (el.disable = true)
    })
  })
}
}

app.componet.html

<ng-template #recursiveList let-persons>
  <tr *ngFor="let parents of persons">
    <td>
      <input
        type="checkbox"
        [disabled]="parents.disable"
        (change)="parentCheckbox($event, parents)"
      />
      {{ parents.Name }}
      <div > 
        <ng-container *ngTemplateOutlet="recursiveList; context:{ $implicit: parents.children }">
          <td>
          
      </td>
        <span
        class="level-2-checkbox"
        [ngClass]="{ disableText: parents.children.disable }"
      ></span>
        </ng-container>
      </div>
      </td>

    </tr>
    </ng-template>
    <ng-container *ngTemplateOutlet="recursiveList; context:{ $implicit: persons }"></ng-container>

最佳答案

如果我理解你的问题,你可以用一个简单的 tree traversal 来解决这个问题算法。

基本上有两种不同的遍历树的可能性:深度优先,这意味着您从父节点开始到一个子节点,然后从那里到另一个子节点,直到您在没有任何子节点的节点结束。然后你回去对 sibling 重复同样的过程,依此类推。 另一种是广度优先,您首先访问一个层次结构级别上的任何节点,然后继续到下一个层次结构。

对于您的示例,您可以使用深度优先算法的递归实现,例如:

interface Person{
  Id:number;
  Name:string;
  checked:boolean;
  disable:boolean;
  children:Person[];
}

const persons : Person[]=[
  {Id:1 , Name: 'Ram',checked:false, disable:false,
   children:[
     {Id:1, Name: 'shyam', checked:false, disable:false, RID:1,
       children:[
         {Id:1, Name: 'shyam1',checked:false, disable:false,  RID:1, 
            children :[
               {Id:1, Name: 'Rambabu2', checked:false, disable:false,RID:1, 
                 children:[
                  {Id:1, Name: 'shyam1',checked:false, disable:false,RID:1}
                 ]
               }
            ]
         }
       ]
  },
  {Id:2, Name: 'Kumar',checked:false, disable:false, RID:1, 
   children:[
      {Id:1, Name: 'shyam',checked:false, disable:false,RID:1}
   ]},
  {Id:3, Name: 'shyam3',checked:false, disable:false,RID:1}]}
]

disableAllChild(node:Person){
  if(node == null) return;
  node.disable = true;
  //recursive call to disableAllChild for all children of the current node 
  node.children?.forEach(child => disableAllChild(child));
}

关于javascript - 带有 Angular 6 的第 n 个子项的层次结构下拉列表。我希望选择父复选框需要隐藏所有子复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67109490/

相关文章:

angular - 呈现 div ngIf 时的事件

html - 在异步管道中设置 img src 对象 url 时防止图像闪烁

javascript - 自动调谐/Python/Javascript

javascript - 如何仅在选择另一个选择(父级)后才显示选择列表

jquery - 使用 jQuery 将 data- 附加到 div

angular - 多个组件Angular 6中的相同代码

javascript - img 的 ckeditor 自定义样式未显示在下拉列表中

c# - 如何使 requiredFieldValidator 在页面其他位置触发消息?

javascript - 是否有一种简单的 JavaScript 方法来操作任意 URL?

asp.net - Header Div位置根据Content Div编辑