Автоматическое перетаскивание при двойном щелчке Angular

#angular #drag-and-drop #angular-material #angular-material2 #angular-cdk

#angular #перетаскивание #angular-материал #angular-материал2 #angular-cdk

Вопрос:

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

Я хотел бы использовать перетаскивание, но также использовал двойной щелчок по одному из элементов списка, чтобы автоматически перенести его в другой список.

Вот мой код: StackBlitz ЗДЕСЬ

 <div
    cdkDropList
    #todoList="cdkDropList"
    [cdkDropListData]="todo"
    [cdkDropListConnectedTo]="[doneList]"
    class="example-list"
    (cdkDropListDropped)="drop($event)"
    (dblclick)="drop($event)">
    <div class="example-box" *ngFor="let item of todo" cdkDrag>{{item}}</div>
</div>
<div
    cdkDropList
    #doneList="cdkDropList"
    [cdkDropListData]="done"
    [cdkDropListConnectedTo]="[todoList]"
    class="example-list"
    (cdkDropListDropped)="drop($event)"
    (dblclick)="drop($event)">
    <div class="example-box" *ngFor="let item of done" cdkDrag>{{item}}</div>
</div>
  

Но это не работает, и я не знаю, как это сделать, я впервые использую перетаскивание.
Если у кого-нибудь есть идея сделать это, мне было бы интересно.

Вот ошибка, отображаемая в консоли при двойном щелчке:

ОШИБКА TypeError: не удается прочитать свойство ‘data’ неопределенного

Ответ №1:

Это из-за $event for cdkDropListDropped и dblclick отличается. For dblclick $event равен экземпляру MouseEvent, поэтому нет информации о том, откуда был перемещен элемент.

Мне пришло в голову одно решение — просто написать пользовательскую функцию, которая будет принимать имя элемента из события dblclick и получать имена цели и источника. С помощью этой информации вы можете легко перемещать элементы между массивами напрямую.

В шаблоне, который вам нужно использовать для перехода от todo к done (dblclick)="dblclickMove($event.target.innerText, 'done', 'todo')" и наоборот для другого блока (dblclick)="dblclickMove($event.target.innerText, 'todo', 'done')"

На контроллере функция выглядит следующим образом:

   dblclickMove(itemName: string, ...targets: string[]) {
    this[targets[0]] = [
      ...this[targets[1]].splice(this[targets[1]].indexOf(itemName), 1), 
      ...this[targets[0]]
      ];
  }
  

StackBlitz

Комментарии:

1. Большое вам спасибо, я проверю это.