代码之家  ›  专栏  ›  技术社区  ›  Madpop

如何使用angular 6和bootstrap 3.3.7创建带有复选框列表的可折叠/可扩展/树结构

  •  8
  • Madpop  · 技术社区  · 6 年前

    {
      "properties": {
        "host": {
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          },
          "type": "text",
          "fielddata": true
        },
        "information": {
          "properties": {
            "filetype": {
              "fields": {
                "keyword": {
                  "ignore_above": 256,
                  "type": "keyword"
                }
              },
              "type": "text",
              "fielddata": true
            },
            "author": {
              "fields": {
                "keyword": {
                  "ignore_above": 256,
                  "type": "keyword"
                }
              },
              "type": "text",
              "fielddata": true
            },
            "authorcountry": {
              "fields": {
                "keyword": {
                  "ignore_above": 256,
                  "type": "keyword"
                }
              },
              "type": "text",
              "fielddata": true
            }
          }
        },
        "url": {
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          },
          "type": "text",
          "fielddata": true
        },
        "name": {
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          },
          "type": "text",
          "fielddata": true
        },
        "instrument": {
          "properties": {
            "Style": {
              "fields": {
                "keyword": {
                  "ignore_above": 256,
                  "type": "keyword"
                }
              },
              "type": "text",
              "fielddata": true
            },
            "instrumentCode": {
              "type": "integer"
            },
            "instrumentName": {
              "type": "text"
            },
            "instrumentNumber": {
              "fields": {
                "keyword": {
                  "ignore_above": 256,
                  "type": "keyword"
                }
              },
              "type": "text",
              "fielddata": true
            }
    
          }
        }
      }
    }
    

    .html代码

    <button class="btn btn-primary" (click)="getData()">getData</button>
    
    
    <h1>ul element</h1>
    
    <hr>
    
     <ul class="list-group"   *ngFor="let x of inf | keyvalue">
        <li class="list-group-item">{{x.key}}</li>
        <ng-container *ngIf="x.value.hasOwnProperty('properties')">
          <ul *ngFor="let y of x.value.properties | keyvalue">
          <li>
            {{y.key}}
          </li>
          </ul>  
        </ng-container> 
      </ul>
    

    可折叠/树状结构

    https://stackblitz.com/edit/angular-k5tdpe

    tree structure

    1 回复  |  直到 6 年前
        1
  •  7
  •   Eliseo    6 年前

    只需添加一个输入类型检查并使用[(ngModel)]

    <ul class="list-group"   *ngFor="let x of inf | keyvalue">
        <li class="list-group-item">
         <!--add a input type checkbox and relation with x.check-->
         <input type="checkbox" [(ngModel)]="x.check">
         {{x.key}}</li>
        <!---change the *ngIf to add the x.check condition-->
        <ng-container *ngIf="x.check && x.value.hasOwnProperty('properties')">
          <ul *ngFor="let y of x.value.properties | keyvalue">
          <li>
            {{y.key}}
          </li>
          </ul>  
        </ng-container> 
      </ul>
    

    更新 如果你想要一个“递归组件”,这很容易。我举一个例子,你可以在 stackblitz

    data = [{
        title: "uno", children: [
          { title: "uno-uno" }]
      },
      {
        title: "dos", children: [
          { title: "dos-uno",children: [
               { title: "dos-uno" }
               ]},
          { title: "dos-dos" }]
      }
      ]
    

    我们可以有一个app.component,比如

      <li *ngFor="let item of data">
         <app-li [title]="item.title" [children]="item.children"></app-li>
      </li>
    

    我们的应用程序李喜欢

    <li (click)="check=!check">
          <div [className]="children?check?'arrow-down':'arrow-up':'arrow-right'"></div>
          {{title}}
    </li>
    <ul *ngIf="children && check">
      <ng-container *ngFor="let item of children">
           <app-li [title]="item.title" [children]="item.children"></app-li>
      </ng-container>
    </ul>
    

    请确保我们在应用程序li中添加“children”

    注意:我添加了一个<部门>使用className“模拟”三角形

    更新2 我们可以自己传递自己的项目

    组件变得像

    @Component({
      selector: 'app-li',
      template: `<li >
                  <div (click)="check=!check" [className]="item.children?
                       check?'arrow-down':'arrow-up':'arrow-right'">
                  </div>
                  <input type="checkbox" [(ngModel)]="item.select" >
                  <span (click)="check=!check">{{item.title}}</span>
                  </li>
                 <ul *ngIf="item.children && check">
                 <ng-container *ngFor="let item of item.children">
                   <app-li [item]="item" ></app-li>
                   </ng-container>
                 </ul>
      `,
        styleUrls: [ './hello.component.css' ]
    
    
    
    })
    export class HelloComponent  {
      @Input() item: any;
    }
    

    <li *ngFor="let item of data">
         <app-li [item]="item" ></app-li>
    </li>
    

    stackblitz forked