如何创建多个拖放区域并在它们之间传递变量

How to create multiple drag & drop zone and pass variable between them

我正尝试在 Angular 中为个人项目创建日历。 我每个月的每一天都有一个 table 和一个 div,在这个 div 里面我有我的约会。 我想做的是能够将我的约会从一天拖放到另一天,我尝试使用 angular cdk 拖放但无法正常工作。

这是我的 table:

的一个单元格
<div #dayCell class="day-cell" cdkDropList (cdkDropListDropped)="drop($event)">
  <div>{{day.getDate()}}</div>
  <div class="schedule-wrapper full-width">
    <div cdkDrag *ngFor="let schedule of schedules" class="schedule" [style.width.px]="getScheduleWidth(schedule)">
      <div class="schedule-details">
        <div class="schedule-text">{{schedule.title}}</div>
      </div>
    </div>
  </div>
</div>

在拖放功能中,我在单元格中添加了当天使用的控制台日志,当我将约会从一天拖到另一天时,记录的日期始终是拖动前一天。

为什么?

有谁知道我怎样才能将我的预约从一个牢房转移到另一个牢房?

编辑:我正在尝试使用下面的答案,但遇到了一些问题:

我已将 cdkDropListGroup 属性添加到我的 table 的 tbody(显示所有日期)

这里是 table 的一个单元格:

<div #dayCell class="day-cell" cdkDropList [cdkDropListData]="schedulesOfDay.schedulesWrapper" (cdkDropListDropped)="drop($event)">
  <div>{{day.getDate()}}</div>
  <div class="schedule-wrapper full-width">

    <ng-container *ngFor="let scheduleWrapper of schedulesOfDay.schedulesWrapper">
      <ng-container *ngIf="scheduleWrapper.isShowed">
        <div >
          <div class="schedule" cdkDrag
               [style.width.px]="getScheduleWidth(scheduleWrapper)"
               [style.height.px]="20"
               [style.top.px]="getScheduleHeightOffset(scheduleWrapper)"
               [style.background]="scheduleWrapper.schedule.background">
          >
            <div class="schedule-details">
              <div class="schedule-text">{{getScheduleTitle(scheduleWrapper)}}</div>
            </div>
          </div>
        </div>
      </ng-container>
    </ng-container>

  </div>
</div>

我在整个单元格上都有 cdkDropList,在我的每个日程表上都有一个 cdkDrag。 问题是当我在 drop 函数中从一个单元格拖动到另一个单元格时,previousContainercontainer 是相同的,所以没有任何移动。 (而且我还在控制台中打印了放置元素的单元格的日期,并且它始终显示拖动之前计划所在的日期)。

我认为问题如下:

当我移动一个元素时,我需要更改该元素的日期(因为我刚刚对我的元素进行了新渲染)。 但是我无法从容器中获取特定移动的元素,我只能拥有所有元素

创建多个拖放区域的一种可能方法是在父元素上使用 cdkDropListGroup 属性。

<div class="container" cdkDropListGroup>
    <app-calendar *ngFor="let date of dates" [date]="date"></app-calendar>
</div>

完成此设置后。您的 app-calendar 组件可以具有以下标记:

<div class="tasks" cdkDropList [cdkDropListData]="dayObj.schedules"
     (cdkDropListDropped)="drop($event)">
    <div *ngFor="let schedule of dayObj.schedules" cdkDrag>
        {{ schedule.title }}
    </div>
</div>

然后处理掉落:

  drop(event: CdkDragDrop<any>) {
    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
      );
    }
  }

moveItemInArraytransferArrayItem这两个方法来自这里:

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

工作stackblitz