【问题标题】:cdkDropListDropped never fired in angular 10 and material tablecdkDropListDropped 从未在 Angular 10 和材料表中触发
【发布时间】:2020-12-28 16:13:41
【问题描述】:

我正在使用 cdkDropList 对材料表中的列进行重新排序。

在版本 8 之前一切正常,但在更新到版本 10 之后,cdkDropListDropped 永远不会触发。

<table mat-table #table [dataSource]="dataSource" 
  cdkDropListGroup>
      <ng-container *ngFor="let disCol of headers; let colIndex = index" matColumnDef="{{disCol.field}}">
          <th mat-header-cell layout-align="start center" class="centered" *matHeaderCellDef
              cdkDropList
              cdkDropListLockAxis="x"
              cdkDropListOrientation="horizontal"
              (cdkDropListDropped)="dropListDropped($event, colIndex)"
              cdkDrag
              (cdkDragStarted)="dragStarted($event, colIndex)"
              [cdkDragData]="{name: disCol.field, columIndex: colIndex}">
            {{disCol.field}}
          </th>
          <td mat-cell layout-align="start center" class="centered" *matCellDef="let row " > {{row[disCol.field]}}
          </td>
      </ng-container>

      <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
      <tr mat-row *matRowDef="let row; columns: displayedColumns;" 
        style="pointer-events: none;"
        >
      </tr>
    </table>

似乎 cdkDropList 和 cdkDrag 不能包含在同一个标​​签中。

有人知道发生了什么吗?

Stackblitz with angular 8

Stackblitz with angular 10

【问题讨论】:

    标签: angular angular-material angular10 angular-cdk


    【解决方案1】:

    试试这个

    <table mat-table #table [dataSource]="dataSource" cdkDropListOrientation="horizontal"
           cdkDropList  (cdkDropListDropped)="drop($event)">
      <ng-container *ngFor="let disCol of headers; let colIndex = index" matColumnDef="{{disCol.field}}">
        <th mat-header-cell layout-align="start center" class="centered" *matHeaderCellDef
            cdkDropList
            cdkDropListLockAxis="x"
            cdkDropListOrientation="horizontal"
            (cdkDropListDropped)="dropListDropped($event, colIndex)"
            cdkDrag
            (cdkDragStarted)="dragStarted($event, colIndex)"
            [cdkDragData]="{name: disCol.field, columIndex: colIndex}">
          {{disCol.field}}
        </th>
        <td mat-cell layout-align="start center" class="centered" *matCellDef="let row " > {{row[disCol.field]}}
        </td>
      </ng-container>
    
      <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
      <tr mat-row *matRowDef="let row; columns: displayedColumns;"
          style="pointer-events: none;"
      >
      </tr>
    </table>
    

    在.ts中

    drop(event: CdkDragDrop<string[]>) {
        moveItemInArray(this.displayedColumns, event.previousIndex, event.currentIndex);
      }
    

    在你的 .ts 中添加这个

    import {CdkDragDrop, moveItemInArray} from '@angular/cdk/drag-drop';
    

    【讨论】:

    • 是的,它奏效了。我还删除了重复的 cdkDropList。你知道为什么它不能与 dropListGroup 一起使用吗?
    • 来自文档“您可以通过设置 cdkDropListConnectedTo 属性或将元素包装在具有 cdkDropListGroup 属性的元素中,将一个或多个 cdkDropList 实例连接在一起。”
    猜你喜欢
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2016-11-22
    • 2019-05-19
    • 2018-10-29
    • 1970-01-01
    • 2020-11-29
    • 2018-10-02
    相关资源
    最近更新 更多