Угловой CDK Drag & Drop основан на перемещении элемента в массиве.И это то, что вы не делаете в своем примере.Чтобы это работало так, как вы описали.Вы должны выполнить следующие шаги.
Первый шаг:
В качестве первого шага вы должны создать @ViewChild
, который получит все эти cdkDropLists
.Массив, который будет содержать ваш panels
.Последним будет свойство listsChecked
.
@ViewChildren('list') lists: QueryList<CdkDropList>;
listArray = [[{col: 4, text: 'one'}], [{col: 4, text: 'two'}], [{col: 4, text: 'two'}]];
private listsChecked: boolean = false;
Второй шаг:
Давайте изменим шаблон HTML
, чтобы он перебирал созданный вами массивна первом этапе.Таким образом, HTML
будет выглядеть следующим образом.
<div class="container">
<div class="row">
<ng-container *ngFor="let listItem of listArray; let i = index">
<div class="list col-md-4">
<div class="list-item panel panel-primary" *ngFor="let item of listItem">
<div class="panel-body">
{{item.text}}
</div>
</div>
</div>
</ng-container>
</div>
</div>
Третий шаг:
Чтобы иметь возможность перетаскивать и обновлять шаблон HTML
из шага 2Во-первых, вы должны добавить cdkDropListGroup
к .row
.Затем добавьте [cdkDropListData]="listItem"
к <div class="col-md-4"></div>
, к тому же элементу добавьте также этот cdkDropList #list="cdkDropList"
, который используется для @ViewChild()
с шага 1, снова к тому же элементу добавьте (cdkDropListDropped)="drop($event)"
, это будет вызывать метод всегда, когда выбросить предметТакже добавьте cdkDdrag в .panel .panel-primary
.Шаблон должен выглядеть следующим образом:
<div class="container">
<div class="row" cdkDropListGroup>
<ng-container *ngFor="let listItem of listArray; let i = index">
<div class="list col-md-4" [cdkDropListData]="listItem" cdkDropList #list="cdkDropList"
(cdkDropListDropped)="drop($event)">
<div class="list-item panel panel-primary" *ngFor="let item of listItem" cdkDrag>
<div class="panel-body">
{{item.text}}
</div>
</div>
</div>
</ng-container>
</div>
</div>
Четвертый шаг:
К вашему *.component.ts
добавить AfterViewChecked для орудий.В ngAfterViewChecked()
добавьте этот код
ngAfterViewChecked() {
if (this.lists.toArray().length > 0 && this.listsChecked === false) {
this.listsChecked = true;
for (let i = 0; i < this.lists.length; i++) {
const array = [];
for (let j = 0; j < this.lists.length; j++) {
if(i !== j) {
array.push(this.lists.toArray()[j]);
}
}
this.lists.toArray()[i].connectedTo = array;
}
}
}
Этот код будет проходить через все элементы с #list
в вашем шаблоне и добавлять каждый cdkDropList
кроме него самого к cdkDropconnectedTo
<- это соединяет больше списковмежду друг другом.И добавьте метод <code>drop().
drop(event: CdkDragDrop<string[]>) {
if (event.previousContainer === event.container) {
moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
} else {
transferArrayItem(event.previousContainer.data,
event.container.data,
event.previousIndex,
event.currentIndex);
}
}
Это проверит, совпадает ли пункт назначения с предыдущим контейнером, и переместится по мере необходимости.drop()
Я получил от Документация Angular Drag & Drop
Все должно работать, контейнеры все равно будут существовать как пустые столбцы.Я надеюсь, что это поможет вам.