22

Angular 7 带来了强大的功能DragDropModulehttps ://material.angular.io/cdk/drag-drop/examples

该文档处理重新排列列表中的项目或在多个列表之间传输项目。但是,它没有谈论表格。

我想知道是否有一种舒适的方法可以使用 angular material 的拖放系统对 mat-table 或 cdk-table 中的行进行重新排序。

(您可以添加cdkDropList使mat-table机制工作但没有所有花哨的动画和默认拖动占位符的内容。)

是否存在类似于通过拖放对表格行进行排序的易于实现的默认设置?

4

5 回答 5

29

样式由 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 上实现拖放的任何人,您需要:

  1. 添加cdkDropListmat-table
  2. 添加(cdkDropListDropped)="onListDrop($event)"mat-table
  3. 添加cdkDragmat-row

onListDrop看起来像:

onListDrop(event: CdkDragDrop<string[]>) {
  // Swap the elements around
  moveItemInArray(this.myArray, event.previousIndex, event.currentIndex);
}

moveItemInArray是一个角材质函数。你可以导入它。

于 2018-12-05T10:28:18.217 回答
15

找到示例https://stackblitz.com/edit/angular-igmugp

看起来缺少的部分是

this.table.renderRows();
于 2019-01-24T16:08:14.403 回答
10

我正在使用MatTableDataSource我的数据源,所以我的解决方案是这样的:

  • 进口DragDropModule_component.module.ts

  • CdkDragDrop组件中导入

  • 添加@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 事件:

    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();
    }
    
于 2020-10-09T08:06:24.347 回答
9

我在 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对我来说是完美的解决方案。

于 2019-11-06T09:58:51.757 回答
1

如果您仍在使用table呈现表格而不是mat-table. 您可以考虑手动设置td表格上每一列的宽度的方法。

请参阅https://trungk18.com/experience/angular-cdk-drag-drop-list-table/上的完整说明和 stackblitz

.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>

这是最终结果

表格内的角度 CDK 拖放列表(不是材料表) - 处理扭曲宽度的行

于 2020-06-09T10:20:25.890 回答