cdkdrag и drop это не волхвы c. это позволяет легко управлять двумя массивами объекта (*) визуально. но это только так: у вас есть два массива, которые отображаются в * ngFor, и вы изменяете массивы (или нет), перетаскивая элементы. После завершения перетаскивания Angular перекрасим два * ngFors
Если вы посмотрите на событие cdkDrapDrop , вы увидите, что оно имеет свойства (среди прочих):
- контейнер: контейнер, в который был уронен предмет. (container.data - это массив, связанный с cdkDropList, в котором был удален элемент)
- currentIndex: текущий индекс элемента.
- previousContainer: контейнер, из которого был выбран элемент. (previousContainer.data - это массив, связанный с cdkDropList, в котором был выбран элемент)
- previousIndex: индекс элемента при его получении
это не обязательно использовать Вы можете использовать функцию TransferArrayItems, например,
drop(event: CdkDragDrop<any>) {
//get the data asociated to the item dragged
const dragItem=previousContainer[previousIndex]
//create an object using this data
const addItem={id: dragItem.id,
title: dragItem.id,
dhours: dragItem.dhours,
//add to the array of the data where we dropped the object
container.data.splice(1, 0, addItem);
}
и поддерживать нетронутым массив массива, связанный с cdkDropList, в момент, когда элемент был выбран. После того, как мы уронили объект, Angular перерисовали два «списка» с данными массивов
(*) Обновлено: Ну, действительно, я говорил о массиве как [cdkDropListData] , но никто не запрещает нам, чтобы данные были простой строкой или простым объектом. Например,
<div cdkDropList [cdkDropListData]="{name:'Name'}"
[cdkDropListConnectedTo]="[cdkBoard]"
(cdkDropListDropped)="drop($event)"
cdkDropListSortingDisabled="true">
<div cdkDrag>
Drag me!
<div *cdkDragPlaceholder></div>
</div>
</div>
указывает, что в событии drop предыдущийContainer.data был объектом {name: 'Name'}