通过角度材料的拖放来重新排序垫子表行

时间:2018-11-19 15:06:27

标签: angular drag-and-drop angular-material mat-table

Angular 7带来了强大的DragDropModule:https://material.angular.io/cdk/drag-drop/examples

文档涉及重新排列列表中的项目或在多个列表之间转移项目。但是,它没有谈论表。

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

(您可以将cdkDropList添加到mat-table中,这会使该机制起作用,但没有所有精美的动画和默认的拖动占位符。)

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

感谢您的帮助:)

6 个答案:

答案 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上实现拖放的人,您需要:

  1. cdkDropList添加到mat-table
  2. (cdkDropListDropped)="onListDrop($event)"添加到mat-table
  3. cdkDrag添加到mat-row

onListDrop看起来像:

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

moveItemInArray是Angular Material函数。您可以导入它。

答案 1 :(得分:4)

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

看缺少的部分是

this.table.renderRows();

答案 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>

这是最终结果

Angular CDK Drag/Drop List inside table (not Material Table) - Handle rows distorting width

答案 5 :(得分:0)

它不适用于垫子表,您可以张贴更多描述的答案或任何代码