Angular CDK 拖放基于数组中的移动项目。这就是你在你的例子中没有做的事情。
以您描述的方式使其工作。您应该按照以下步骤操作。
第一步:
作为第一步,您应该创建一个@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>
第三步:
为了能够从步骤 2 中拖放更新 HTML 模板。首先,您应该将 cdkDropListGroup 添加到 .row。接下来将[cdkDropListData]="listItem" 添加到<div class="col-md-4"></div>,将这个cdkDropList #list="cdkDropList" 添加到第1 步中的@ViewChild(),再次添加到同一个元素,添加(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 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);
}
}
这将检查目的地是否与之前的容器相同,并根据需要移动。我从Angular Drag & Drop documentation得到的drop()
一切正常,容器仍将作为空列存在。我
希望对你有帮助。