Angular 7带来了强大的DragDropModule:https://material.angular.io/cdk/drag-drop/examples
文档涉及重新排列列表中的项目或在多个列表之间转移项目。但是,它没有谈论表。
我想知道是否有一种舒适的方法来使用角材料的拖放系统对mat-table或cdk-table中的行进行重新排序。
(您可以将cdkDropList添加到mat-table中,这会使该机制起作用,但没有所有精美的动画和默认的拖动占位符。)
是否存在类似易于实现的默认设置,用于通过拖放对表行进行排序?
感谢您的帮助:)
答案 0 :(得分:7)
样式由CSS完成(请查看示例页面上的CSS选项卡)。我对它进行了调整以使其与mat-table配合使用:
.cdk-drag-preview {
box-sizing: border-box;
border-radius: 4px;
box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),
0 8px 10px 1px rgba(0, 0, 0, 0.14),
0 3px 14px 2px rgba(0, 0, 0, 0.12);
}
.cdk-drag-placeholder {
opacity: 0;
}
.cdk-drag-animating {
transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
}
.cdk-drop-list-dragging .mat-row:not(.cdk-drag-placeholder) {
transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
}
我将其放置在主要的styles.scss文件中。
对于任何想知道如何在mat-table上实现拖放的人,您需要:
cdkDropList
添加到mat-table
(cdkDropListDropped)="onListDrop($event)"
添加到mat-table
cdkDrag
添加到mat-row
onListDrop
看起来像:
onListDrop(event: CdkDragDrop<string[]>) {
// Swap the elements around
moveItemInArray(this.myArray, event.previousIndex, event.currentIndex);
}
moveItemInArray
是Angular Material函数。您可以导入它。
答案 1 :(得分:4)
答案 2 :(得分:2)
我在stackblitz上找到了一个很好的例子:https://stackblitz.com/edit/table-drag-n-drop
要不破坏拖放预览的用户界面,请使用标签
<mat-table>...</mat-table>
<mat-header-cell>...</mat-header-cell>
<mat-cell>...</mat-cell>
<mat-header-row>...</mat-header-row>
<mat-row>...</mat-row>
代替
<table mat-table>...</table mat-table>
<th mat-header-cell>...</th mat-header-cell>
<td mat-cell>...</td mat-cell>
<tr mat-header-row>...</tr mat-header-row>
<tr mat-row>...</tr mat-row>
结合https://stackoverflow.com/a/53630171/12331146中提到的CSS,这对我来说是完美的解决方案。
答案 3 :(得分:2)
我在数据源中使用MatTableDataSource
,所以我的解决方案是这样:
在{strong>组件和CdkDragDrop
component.module.ts
将@ViewChild('table') table: MatTable<any>;
添加到component.ts
。
在HTML中添加:
<table mat-table #table [dataSource]="dataSource" class="mat-elevation-z8"
cdkDropList
[cdkDropListData]="dataSource"
(cdkDropListDropped)="drop($event)">
您需要在*matRowDef
上添加以下内容:
<tr mat-row *matRowDef="let row; columns: displayedColumns;"
cdkDrag
[cdkDragData]=row>
</tr>
然后在component.ts
中创建放置事件:
drop(event: CdkDragDrop<Scene[]>) {
const previousIndex = this.dataSource.data.findIndex(row => row === event.item.data);
moveItemInArray(this.dataSource.data,previousIndex, event.currentIndex);
this.dataSource.data = this.dataSource.data.slice();
}
答案 4 :(得分:1)
如果您仍在使用table
而不是mat-table
来呈现表格。您可以考虑手动设置表格上每个td
列的宽度的方法。
请参见https://trungk18.com/experience/angular-cdk-drag-drop-list-table/
上的完整说明和堆叠闪电战.col-xs {
width: 2%;
}
.col-sm {
width: 10%;
}
.col-md {
width: 20%;
}
<tbody cdkDropList (cdkDropListDropped)="onDrop($event)">
<tr *ngFor="let user of users" cdkDrag cdkDragLockAxis="y">
<th class="col-xs">
<div class="drag-handle">
<ng-container [ngTemplateOutlet]="dragHandleTmpl"> </ng-container>
</div>
</th>
<td class="col-md"></td>
<td class="col-md"></td>
<td class="col-md"></td>
<td class="col-md"></td>
</tr>
</tbody>
这是最终结果
答案 5 :(得分:0)
它不适用于垫子表,您可以张贴更多描述的答案或任何代码