当前位置: 首页 > 知识库问答 >
问题:

如何限制拖放容器只接受角材料拖放功能中的一个项目

左丘繁
2023-03-14

使用@angular/cdk/拖放模块(角度材质拖放)时。。。有没有办法限制drop容器只接受一个值而不是多个值?我试图创建一个表单,用户可以将图像拖放到只有一个项目的字段中。我使用标准示例代码来实现拖放| Angular Material,但无法找到可以限制拖放项目数量的解决方案,第二个无法找到保持拖放列表不变的解决方案(拖放项目将保留在拖放容器中),因此您可以复制项目,而不是将项目移动到拖放容器中。是否有任何解决方案或人员可以帮助编写示例代码?

超文本标记语言:

    <div class="example-container">
  <h2>To do</h2>

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

<div class="example-container">
  <h2>Done</h2>

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

TS:

import {Component} from '@angular/core';
import {CdkDragDrop, moveItemInArray, transferArrayItem} from '@angular/cdk/drag-drop';

/**
 * @title Drag&Drop connected sorting
 */
@Component({
  selector: 'cdk-drag-drop-connected-sorting-example',
  templateUrl: 'cdk-drag-drop-connected-sorting-example.html',
  styleUrls: ['cdk-drag-drop-connected-sorting-example.css'],
})
export class CdkDragDropConnectedSortingExample {
  todo = [
    'Get to work',
    'Pick up groceries',
    'Go home',
    'Fall asleep'
  ];

  done = [
    'Get up',
    'Brush teeth',
    'Take a shower',
    'Check e-mail',
    'Walk dog'
  ];

  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);
    }
  }
}

共有3个答案

陈坚
2023-03-14

另一个解决方案是将[cdkDropListData]=“[]”设置为硬编码的空列表。从cdk的角度来看,这是一个列表,但实际上并不适用于你的应用程序

然后,您只需在该位置显示您想要的任何内容(如果项目已设置),并处理cdkDragDrop事件来更新它。

    <div class="slot"        
         cdkDropList
         [cdkDropListData]="[]"
         (cdkDropListDropped)="drop($event)">

       <!-- display your item here with *ngIf -->

    </div>


.slot
{
   min-height: 50px;
}
扶誉
2023-03-14

这是我的版本的一个工作演示,允许覆盖。

确保你的屏幕足够宽,你可以看到两列。

您应该使用cdkdroplisterpredicate

如果您的目的地“槽”已满,则从此处返回false。

请注意,您的处理程序是从一个上下文中调用的,不是您的组件。因此,您需要在组件中使用类似的lambda函数。

destinationNotEmptyPredicate = () => 
{
   return this.destinationArray.length == 0;
};

确保目的地列表有一个高度,这样你就可以在其中放置一些东西。

然而,如果您需要允许覆盖“假列表”中现有的单个项目(您可能会这样做),那么这就有点棘手了。您不想使用此谓词(因为它会阻止您删除任何内容,除非您首先删除现有项)。

所以在这种情况下,你需要做一个css调整来隐藏已经存在的项目(当你悬停在它上面时)。

#甚至是目的地列表。

#even.cdk-drop-list-dragging .cdk-drag:not(.cdk-drag-placeholder) {
   display: none;
}

同时设置[cdkDropListSortingDisabled]=“false”以避免出现奇怪的动画故障。

当您“删除”项目时,您的目的地列表应仅包含一个项目:

drop(event: CdkDragDrop<number[]>) {
    if (event.previousContainer === event.container) {
      moveItemInArray(
        event.container.data,
        event.previousIndex,
        event.currentIndex
      );
    } else {
      this.even = [event.item.data];
    }
  }

请注意,我仍然在这里使用cdkDropListENPredicate来只允许删除偶数。

越英韶
2023-03-14

好的,这应该行得通:

movementCount: number = 0;

drop(event: CdkDragDrop<string[]>) {
   if (event.previousContainer === event.container) {
      moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
    } else if(this.movementCount === 0){
       this.movementCount++;  // block next object from being moved
       // copy obj being moved
       var movingObj = event.previousContainer.data[event.previousIndex];

       transferArrayItem(event.previousContainer.data,
                    event.container.data,
                    event.previousIndex,
                    event.currentIndex);

       // transfer complete so copy object back
       event.previousContainer.data.push(movingObj);    
  }
}

我使用了一个计数器来确定移动是否被允许,但是布尔值也同样有效(更好)。您只需要添加额外的代码,这样当图像从它携带到的div中移除/删除时,计数器将返回到零/假,以便在需要时可以拖动另一个图像。

希望有帮助。

 类似资料:
  • 使用Material CDK库中的拖放行为,我试图在拖动元素时更改光标。 例如,在此StackBlitz中,光标悬停时为。我希望它在拖动时变为抓取。这方面的一个例子是在Google工作表中抓取一行时发生的情况: 读取样式化拖放组件的留档,看起来向这个类添加游标属性应该可以做到这一点: . cdk-drop-list-draging:当用户拖动项目时添加到cdkDropList的类。 代码如下所示:

  • 该类被用于提供一个拖放交互。 代码示例 const controls = new DragControls( objects, camera, renderer.domElement ); // add event listener to highlight dragged objects controls.addEventListener( 'dragstart', function ( eve

  • 如何验证Dropwizard管理门户,以限制普通用户访问它?请帮忙

  • 本文向大家介绍python3+PyQt5实现拖放功能,包括了python3+PyQt5实现拖放功能的使用技巧和注意事项,需要的朋友参考一下 本文是对《Python Qt GUI快速编程》的第10章的例子拖放用Python3+PyQt5进行改写,对图表列表,表格等进行相互拖放,基本原理雷同,均采用setAcceptDrops(True)和setDragEnabled(True)。 运行结果: 以上就

  • 我试图拖放一个元素,但无法在所需位置释放该元素。 问题是:我想把元素放在一个仅在运行时可见的占位符中(即:当我点击并按住元素并移动到目标元素时),在移动到目标元素后,占位符在我应该释放元素的位置被激活。 以下是我的代码:(FirefoxDriver初始化后) 以下是HTML源代码片段(发布元素部分): “”在“”下被激活,具体取决于拖动后我将该元素带到的位置。 问题: 1-在执行脚本时,如果我移动

  • 我有两个名为表1和表2的表,每个表由两行组成。 我可以在同一个表中拖放元素 您能告诉我是否可以将表行从表1拖放到表2,反之亦然(在不同的表中移动行) 这是两个表的超文本标记语言 还有我的js代码 这是我的小提琴 https://jsfiddle.net/wdy1ty89/7/