gpt4 book ai didi

angular - 如何为源和接收器下拉列表使用不同的 ckdDragPlaceholders?

转载 作者:行者123 更新时间:2023-12-04 12:24:17 30 4
gpt4 key购买 nike

我正在使用 Angular Material 的 Drag and Drop 模块来移动一些元素。

更具体地说,我有多个 cdkDropList ,每个都有一个 cdkDrag :

<div *ngFor="let l of lists">
<div cdkDropList [cdkDropListConnectedTo]="all_lists">
<div cdkDrag>
content
</div>
</div>
</div>

每当我从列表中移动元素时,我都希望有一个占位符,例如:
 <div cdkDrag>
content
<div *cdkDragPlaceholder>
placeholder content
</div>
</div>

但是,当我这样做时,占位符内容将显示在丢失(当前被拖动)元素(源列表)的位置以及其新位置(接收器列表)的位置。我希望能够保留接收器列表的默认行为(显示根元素又名 content ),并且只为源列表设置占位符。

我无法区分这两个地方,因为它似乎甚至在“接收器”位置,它显示的是源元素的 HTML(这有点有道理,因为占位符是 cdkDrag 而不是 cdkDropList 的属性)。

如何使用不同的占位符代替元素的原始位置与新位置?

堆栈 Blitz example

直觉:(多个)列表是一副牌,当将一张牌从 A 移动到 B 时,我看到 A 牌组中的第二张(自定义占位符)牌,但是当我将顶部的 A 牌悬停在 B 上时,我在那里看到了顶 A 牌。

最佳答案

如果我正确理解您的问题,您只想在拖动到另一个列表时显示自定义占位符,并在同一列表中拖动时显示默认值。

要检测源列表外的移动,您可以使用 cdkDragEntered每当将项目从外部拖入列表时触发的事件。在 CdkDragEnter事件数据您拥有您输入的列表信息以及有关被拖动项目的所有信息。该项目包含它当前所属的列表的信息。这意味着当我们输入的列表与项目列表不同时,已经输入了另一个列表。获得此信息后,您可以根据此信息更改占位符内显示的内容。

我已将您的 StackBlitz 示例更改为这种方法。

组件代码:

export class CdkDragDropConnectedSortingGroupExample {
todo = [
'Get to work',
'Pick up groceries',
'Go home',
'Fall asleep'
];

done = [
'Get up',
'Brush teeth',
'Take a shower',
];

another = [
'Check e-mail',
'Walk dog'
]

lists = [this.todo, this.done, this.another];

public draggingOutsideSourceList: boolean = false;

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);
}
this.draggingOutsideSourceList = false; // always reset after drag drop finishes
}

onCdkDragEntered(event: CdkDragEnter<string>) {
this.draggingOutsideSourceList = event.container !== event.item.dropContainer;
}
}

模板:
<div cdkDropListGroup>
<div class="example-container todoList" *ngFor="let list of lists">
<div cdkDropList [cdkDropListData]="list" class="example-list" (cdkDropListDropped)="drop($event)">

<div cdkDrag *ngFor="let item of list" (cdkDragEntered)="onCdkDragEntered($event)">
<ng-template #itemTpl>
<div class="example-box">{{item}}</div>
</ng-template>
<div *cdkDragPlaceholder>
<div *ngIf="draggingOutsideSourceList; else itemTpl" class="customPlaceHolder">
Custom placeholder content only in sink list
</div>
</div>
<ng-container *ngTemplateOutlet="itemTpl"></ng-container>
</div>
</div>
</div>
</div>

如您所见,我创建了三个列表,使用 cdkDragEntered通过设置 draggingOutsideSourceList 来确定拖动是在源列表外部还是内部的事件模板中使用的属性来选择在占位符中显示的内容。

这里还有一个 link to a fork of your StackBlitz在那里你可以看到它的工作。

关于angular - 如何为源和接收器下拉列表使用不同的 ckdDragPlaceholders?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62224019/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com