В своем проекте я использую функцию перетаскивания 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;
}





CdkDropListGroup в ваш TaskStatusListComponent.import { CdkDropListGroup } from '@angular/cdk/drag-drop';
@Component({
selector: 'app-task-status-list',
standalone: true,
imports: [TaskStatusComponent, CdkDropListGroup],
...
})
export class TaskStatusListComponent {
...
}
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];
}
...
}
Вы не обновляете статус, поэтому удаленные задачи повторно отображаются в столбце, соответствующем их исходному статусу.