typescript 是否有办法在Angular 嵌套树视图中突出显示唯一选定的项目?

hc8w905p  于 2023-01-27  发布在  TypeScript
关注(0)|答案(1)|浏览(109)

我试图在我的Angular 项目中从嵌套数据构建一个树形视图,我只想突出显示选定的项目。下面是我尝试过的stackblitz链接。https://angular-ivy-wcv63x.stackblitz.io
当前它突出显示所有选定的项目,并关闭isitemSelected == false
请建议/帮助,如果有任何丢失的元素在我的代码.

6mzjoqzu

6mzjoqzu1#

当我们想要“只选择一个”时,我们使用简单的变量并存储值,而不使用“项目”的属性或数组。

itemSelected:any=null

并将ngClass用作

<div class="treeView" (click)="onexpand(item)"  
      [ngClass]="{'treeViewSelected': item==itemSelected, 
                  'treeViewExpanded': item.isExpanded}">
    ...
</div>

因为“itemSelected”只有一个,你需要itemSelected属于“parent”。所以我们使用itemSelected itemSelectedChange。因为我们有一个递归元素,我们还需要将值发送到“parent”。所以itemSelect实际上将是,一个@Input,一个@Ouput和一个getter来发送值。有些像

_itemSelected: any = null;
  @Input('itemSelected') set _(value: any) {
    this._itemSelected = value;
  }
  get itemSelected() {
    return this._itemSelected;
  }
  set itemSelected(value: any) {
    this._itemSelected = value;
    this.itemSelectedChange.emit(value);
  }
  @Output() itemSelectedChange: EventEmitter<any> = new EventEmitter<any>();

并使用emit更改onexpand

onexpand(item) {
    this.itemSelectedChange.emit(item == this.itemSelected ? null : item);

    if (item.expanded) {
      item.expanded = !item.expanded;
      return;
    } else {
      if (item.children) {
        if (item.children.length > 0) {
          item.expanded = true;
        } else {
          item.expanded = false;
        }
      }
    }
  }

现在我们使用两种方式绑定。
应用程序组件中

itemSelected:any=null
//and

<app-tree [items]="sampleData" [(itemSelected)]="itemSelected"></app-tree>

在递归组件中

<ul class="tree-view">
  <li *ngFor="let item of items">
    ...
    <ul *ngIf="item.children && item.expanded">
      <!--here use the two binding too-->
      <app-tree [items]="item.children" [(itemSelected)]="itemSelected">
      </app-tree>
    </ul>
  </li>
</ul>

您的forked stackblitz

相关问题