CDK Drag Drop 无法正确更改图像的位置
CDK Drag Drop does not correctly change the position of images
我创建了一个图片库,我打算更改它们之间的位置。为此,我正在使用拖放 cdk 库。
我的问题是图像交换并不总是正确发生,有时我交换第一张图像和第二张图像,但这种交换没有发生。
我怎样才能让这个功能齐全,水平和垂直?
有没有办法只有当图像存储在 mdc-image-list - with-text-protection 中时才能开始拖动 class?
谢谢!
.HTML
<ul class="mdc-image-list my-image-list" style="padding-left: 10px;padding-right: 10px;" cdkDropList [cdkDropListData]="data"
(cdkDropListDropped)="drop($event)">
<ng-container *ngFor="let product of data; let j = index;">
<li class="mdc-image-list__item" cdkDrag>
<div class="mdc-image-list__image-aspect-container">
<ng-container *ngIf="product.image == null; else productImage">
<img src="" class="mdc-image-list__image imagenotfound">
</ng-container>
<ng-template #productImage>
<img [src]="product.image" class="mdc-image-list__image">
</ng-template>
</div>
<div class="mdc-image-list--with-text-protection">
<div class="mdc-image-list__supporting mdc-image-list__supporting">
<span class="mdc-image-list__label">{{product.name}}</span>
</div>
</div>
</li>
</ng-container>
</ul>
.ts
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
);
}
}
我发现允许在网格中拖放的唯一方法是网格的每个元素都是一个 cdkDropList。
广告:拖动时元素不会移动
嗯,因为每个cdkDropList的数据都是一个对象,我们要传输的数据和索引
[cdkDropListData]="{item:product,index:j}"
因此,我们的函数 dropEvent 根据这些值更改数组数据
drop(event: CdkDragDrop<any>) {
this.data[event.previousContainer.data.index]={...event.container.data.item}
this.data[event.container.data.index]={...event.previousContainer.data.item}
event.currentIndex=0;
}
是的!我们不强制使用 drop 作为示例。认为我们唯一想要的就是改变一个数组。
还有一件事要做,让"dragPlaceHolder变成空的div
<div cdkDrag>
....
<div *cdkDragPlaceholder></div>
</div>
嗯,html 有点复杂,因为自己的 mdc-image-list 很复杂。重要的是要注意所有的 cdkDropList 必须包含在 div ckdDropListGroup
中
<div cdkDropListGroup>
<ul class="mdc-image-list my-image-list" style="padding-left: 10px;padding-right: 10px;">
<ng-container *ngFor="let product of data; let j = index;">
<li class="mdc-image-list__item" cdkDropList [cdkDropListData]="{item:product,index:j}"
cdkDropListOrientation="horizontal" (cdkDropListDropped)="drop($event)">
<div cdkDrag>
<div class="mdc-image-list__image-aspect-container">
<ng-container *ngIf="product.image == null; else productImage">
<img src="" class="mdc-image-list__image imagenotfound">
</ng-container>
<ng-template #productImage>
<img [src]="product.image" class="mdc-image-list__image">
</ng-template>
</div>
<div class="mdc-image-list--with-text-protection">
<div class="mdc-image-list__supporting mdc-image-list__supporting">
<span class="mdc-image-list__label">{{product.name}}</span>
</div>
</div>
<div class="example-custom-placeholder" *cdkDragPlaceholder></div>
</div>
</li>
</ng-container>
</ul>
</div>
注意:如果有人想要更简单的示例,请参阅此 another stackblitz
我创建了一个图片库,我打算更改它们之间的位置。为此,我正在使用拖放 cdk 库。
我的问题是图像交换并不总是正确发生,有时我交换第一张图像和第二张图像,但这种交换没有发生。
我怎样才能让这个功能齐全,水平和垂直?
有没有办法只有当图像存储在 mdc-image-list - with-text-protection 中时才能开始拖动 class?
谢谢!
.HTML
<ul class="mdc-image-list my-image-list" style="padding-left: 10px;padding-right: 10px;" cdkDropList [cdkDropListData]="data"
(cdkDropListDropped)="drop($event)">
<ng-container *ngFor="let product of data; let j = index;">
<li class="mdc-image-list__item" cdkDrag>
<div class="mdc-image-list__image-aspect-container">
<ng-container *ngIf="product.image == null; else productImage">
<img src="" class="mdc-image-list__image imagenotfound">
</ng-container>
<ng-template #productImage>
<img [src]="product.image" class="mdc-image-list__image">
</ng-template>
</div>
<div class="mdc-image-list--with-text-protection">
<div class="mdc-image-list__supporting mdc-image-list__supporting">
<span class="mdc-image-list__label">{{product.name}}</span>
</div>
</div>
</li>
</ng-container>
</ul>
.ts
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
);
}
}
我发现允许在网格中拖放的唯一方法是网格的每个元素都是一个 cdkDropList。
广告:拖动时元素不会移动
嗯,因为每个cdkDropList的数据都是一个对象,我们要传输的数据和索引
[cdkDropListData]="{item:product,index:j}"
因此,我们的函数 dropEvent 根据这些值更改数组数据
drop(event: CdkDragDrop<any>) {
this.data[event.previousContainer.data.index]={...event.container.data.item}
this.data[event.container.data.index]={...event.previousContainer.data.item}
event.currentIndex=0;
}
是的!我们不强制使用 drop 作为示例。认为我们唯一想要的就是改变一个数组。
还有一件事要做,让"dragPlaceHolder变成空的div
<div cdkDrag>
....
<div *cdkDragPlaceholder></div>
</div>
嗯,html 有点复杂,因为自己的 mdc-image-list 很复杂。重要的是要注意所有的 cdkDropList 必须包含在 div ckdDropListGroup
中<div cdkDropListGroup>
<ul class="mdc-image-list my-image-list" style="padding-left: 10px;padding-right: 10px;">
<ng-container *ngFor="let product of data; let j = index;">
<li class="mdc-image-list__item" cdkDropList [cdkDropListData]="{item:product,index:j}"
cdkDropListOrientation="horizontal" (cdkDropListDropped)="drop($event)">
<div cdkDrag>
<div class="mdc-image-list__image-aspect-container">
<ng-container *ngIf="product.image == null; else productImage">
<img src="" class="mdc-image-list__image imagenotfound">
</ng-container>
<ng-template #productImage>
<img [src]="product.image" class="mdc-image-list__image">
</ng-template>
</div>
<div class="mdc-image-list--with-text-protection">
<div class="mdc-image-list__supporting mdc-image-list__supporting">
<span class="mdc-image-list__label">{{product.name}}</span>
</div>
</div>
<div class="example-custom-placeholder" *cdkDragPlaceholder></div>
</div>
</li>
</ng-container>
</ul>
</div>
注意:如果有人想要更简单的示例,请参阅此 another stackblitz