Angular Material Drag and drop в таблице

У меня проблема с Angular Material: Мне нужна в моей таблице функция перетаскивания, но она не работает.

это мой код component.ts:

dropTable(event: CdkDragDrop <test[]>) {
  moveItemInArray(this.childTest.data, event.previousIndex, event.currentIndex);
  this.childTestTable.renderRows();
}
Тестирование функциональных 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
0
3 446
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш список должен быть помечен cdkDropList и привязан к [cdkDropListData] = "data". Если вы хотите перетащить элемент из одного списка в другой, вы должны соединить их с помощью [cdkDropListConnectedTo] = "ids"

В component.ts попробуйте:

moveItemInArray(
  event.container.data,
  event.previousIndex,
  event.currentIndex);

Спасибо за помощь, у меня в мат-таблице cdkDropList и cdkDropListData. Я также добавил event.container.data, но не работает.

user11148601 12.04.2019 15:16
Ответ принят как подходящий

На самом деле обновление данных при использовании cdkDragDrop для таблиц материалов, к сожалению, немного шатко. Я создал рабочий poc, на который вы можете посмотреть: https://stackblitz.com/edit/table-drag-n-drop

Важно то, что данные таблицы нужно обновлять вручную, вот моя функция перетаскивания:

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

// updates moved data and table, but not dynamic if more dropzones
this.dataSource.data = clonedeep(this.dataSource.data);
this.dataSource2.data = clonedeep(this.dataSource2.data);
}

спасибо за вашу помощь, я попробовал ваш код, но у меня не работает

user11148601 12.04.2019 15:12

Тогда, я думаю, вы должны опубликовать полный пример того, что не работает, так как это работает в этом poc ?

Lars Rødal 12.04.2019 19:48

Привет @LarsRødal, это работает, но мне нужно отслеживать исходный массив данных. С clonedeep это невозможно, я попытался создать в ngOnInit источник маттабличных данных с именем «initialData», но он также изменился после перестановки элементов.

Usr 07.11.2019 12:54

Да, вам нужно сделать cloneDeep для повторного рендеринга списка, если этого не сделать, вы не получите правильные privouseIndex и currentIndex при следующем перетаскивании. К сожалению, я не знаю почему.

Nguyen Tran 13.12.2019 11:02

Вы можете избежать клонирования источников данных, явно обновив таблицы: this.table1.renderRows(); this.table2.renderRows();

cppstudy 31.07.2020 13:13

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