Я хочу получить вложенный рекурсивный список, работающий в режиме перетаскивания. Я пытаюсь сделать так, чтобы элемент из внутреннего вложенного списка мог переместиться в любой другой вложенный список или в свою собственную группу. Проблема в том, что я рассмотрел несколько различных примеров и вопросов из Stack здесь, и не было успешной идеи, чтобы заставить это работать.
Вот некоторые вопросы и примеры, на которые я смотрел:
stackblitz
Stackoverflow # 1
Stackoverflow # 2
Stackoverflow # 3
Итак, у вас есть идея, вот пример моих данных:
Там, где в каждом Районе могут быть дети, у каждого ребенка также могут быть дети. Так что это создает вложенные данные.
В моем угловом компоненте я использую рекурсию для воссоздания уровней каждый раз, проверяя этот пример:
component.ts:
dropGroup(event: CdkDragDrop<string[]>) {
let area = event.item.data;
console.log('group', area, event)
}
dropItem(event: CdkDragDrop<string[]>) {
let area = event.item.data;
console.log('item', area, event)
}
component.html:
<div cdkDropList #parentList="cdkDropList" (cdkDropListDropped)="dropGroup($event)" [cdkDropListData]="areas">
<div cdkDropListGroup class="area-wrapper" *ngFor="let area of areas;" cdkDrag [cdkDragData]="area">
<div class="area-list">
<div [ngClass]="area.children.length ? 'area-toggle' : 'area'" [style.paddingLeft.px]="area.level > 1 ? area.level*15 : 0">
<div class="top-wrapper">
<div class="top-toggle" *ngIf="area.children.length">
<mat-icon (click)="showChildren(area)" *ngIf="!area.showToggle">keyboard_arrow_right</mat-icon>
<mat-icon (click)="showChildren(area)" *ngIf="area.showToggle">keyboard_arrow_down</mat-icon>
</div>
<span class="area-name">{{ area.name }}</span>
</div>
<div class="area-buttons">
<button class="area-button area-add" mat-icon-button (click)="addNewItem(area)">
<mat-icon>add</mat-icon>
</button>
<button class="area-button area-edit" mat-icon-button (click)="editArea(area)">
<mat-icon>edit</mat-icon>
</button>
<button class="area-button area-delete" mat-icon-button (click)="deletingArea($event, area, area.name)">
<mat-icon>delete</mat-icon>
</button>
<button cdkDragHandle class="drag-handle" mat-icon-button>
<mat-icon>drag_handle</mat-icon>
</button>
</div>
</div>
<div class="toggle-children" *ngIf="area.showToggle" cdkDropList (cdkDropListDropped)="dropItem($event)">
<sp-area-list
*ngIf="area.children"
[areas]="area.children"
(deleteArea)="deletingArea($event, area)"
(addingArea)="addNewItem($event)"
(editingArea)="editArea($event)">
</sp-area-list>
</div>
</div>
</div>
</div>
Каждый раз, когда я пробую разные примеры, консоль перетаскивания показывает только тот контейнер, с которого начался элемент, а не то, куда он был перемещен ... ни один из примеров не работал или не помог мне решить то, что я пытаюсь выполнить.
Кто-нибудь имел успех с вложенными рекурсивными списками с помощью перетаскивания CDK?
Спасибо за вашу помощь!