Angular Material Drag and Drop: перетаскивание элемента работает, но не отбрасывается

В своем проекте я использую функцию перетаскивания Angular Material. Хотя перетаскивание работает нормально, у меня возникают проблемы с удалением элементов. Предметы можно перетаскивать, но когда я пытаюсь бросить их в зону перетаскивания, предметы перемещаются в предыдущую зону, а не в целевую зону.

Что я делаю не так?

Полный пример: Демо @ StackBlitz

Вот упрощенная версия моего кода:

задача-статус-list.comComponent.html

<div cdkDropListGroup class = "task-status-list-container">
  @for (taskStatus of Object.values(TASK_STATUSES); track taskStatus.key) {
  <app-task-status [taskStatus] = "taskStatus"></app-task-status>
  }
</div>

задача-статус.компонент.html

<div class = "task-status-container">
  <div class = "title-container">
    <div class = "title">{{ taskStatus.value }}</div>
  </div>

  <div
    cdkDropList
    [cdkDropListData] = "assignTasksByStatus(taskStatus.key)"
    (cdkDropListDropped) = "drop($event)"
    class = "task-status-container-body"
  >
    @for (task of assignTasksByStatus(taskStatus.key);track task.id) {
    <app-task cdkDrag [task] = "task"></app-task>
    }
  </div>
</div>

задача-статус.компонент.ts

export class TaskStatusComponent {
  protected readonly TASK_STATUSES = TASK_STATUSES;
  @Input() taskStatus!: TaskStatus;
  tasksSubscription!: Subscription;
  tasks: Task[] = [
    { id: 1, title: 'Task 1', status: TASK_STATUSES['TO_DO'] },
    { id: 2, title: 'Task 2', status: TASK_STATUSES['TO_DO'] },
    { id: 3, title: 'Task 3', status: TASK_STATUSES['DONE'] },
  ];

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

  public assignTasksByStatus(status: string): Task[] {
    return this.tasks.filter((task) => task.status.key === status);
  }
}

задача.компонент.html

<div class = "title">{{ task.title }}</div>

Task.comComponent.ts

export class TaskComponent {
  @Input() task!: Task;
}

Вы не обновляете статус, поэтому удаленные задачи повторно отображаются в столбце, соответствующем их исходному статусу.

Robby Cornelissen 21.05.2024 03:46
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
1
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Вам необходимо импортировать автономный компонент: CdkDropListGroup в ваш TaskStatusListComponent.
import { CdkDropListGroup } from '@angular/cdk/drag-drop';

@Component({
  selector: 'app-task-status-list',
  standalone: true,
  imports: [TaskStatusComponent, CdkDropListGroup],
  ...
})
export class TaskStatusListComponent {
  ...
}
  1. В вашем TaskStatusComponent я бы предложил разделить tasks по статусу (tasksByStatus) вместо того, чтобы делиться данными в одном массиве tasks. Целью этого является то, чтобы каждый экземпляр компонента CdkDropList имел собственный набор данных.
export class TaskStatusComponent {
  ...

  tasksByStatus!: { [key: string]: Task[] };

  ngOnInit() {
    this.tasksByStatus = Object.keys(TASK_STATUSES).reduce((acc, cur) => {
      acc[cur] = this.tasks.filter((x) => x.status.key === cur);

      return acc;
    }, {} as { [key: string]: Task[] });
  }

  public assignTasksByStatus(status: string): Task[] {
    return this.tasksByStatus[status];
  }

  ...
}

Демо @ StackBlitz

Другие вопросы по теме