Angular CDK 拖放:不要移动源项目

Posted

技术标签:

【中文标题】Angular CDK 拖放:不要移动源项目【英文标题】:Angular CDK Drag & Drop: Don't move source item 【发布时间】:2019-09-30 12:11:37 【问题描述】:

我正在尝试实现一个编辑器,可以在其中拖动项目以将其添加到主要内容中,问题是当我拖出源项目容器时源项目总是被破坏。

有没有办法强制源项目保持在原位,同时仍然可以拖放项目?基本上,我想要一个复制行为而不是移动行为。

我已经看到了与我基本上想要实现的目标相对应的其他问题,但它们都没有真正帮助我,因为这些问题更多的是关于如何在技术上完成复制项目,而我想知道我是如何做到的在 UI 中实现此行为,因为它非常难以查看项目是否刚刚消失。

【问题讨论】:

Drag Drop CDK: keep showing dragged element inside starting list的可能重复 【参考方案1】:

替换

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

drop(event: any) 
  if (event.previousContainer === event.container) 
    moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
   else 
    copyArrayItem(
      event.previousContainer.data,
      event.container.data,
      event.previousIndex,
      event.currentIndex
    );
  

【讨论】:

感谢您的解决方案。但是,对于这种行为,在移动元素的列表中存在样式问题。它会在列表中波动,因为它看起来像是删除然后将元素添加到列表中以进行复制操作。请参考这个 stackblitz 链接 - stackblitz.com/edit/…【参考方案2】:

导入import copyArrayItem from '@angular/cdk/drag-drop';

transferArrayItem 替换为copyArrayItem

【讨论】:

【参考方案3】:

您需要找到目标和源的位置,然后复制该值

案例一:从一个可拖动列表复制到另一个可拖动列表

   drop(event: any) 
        if (event.previousContainer === event.container) 
              moveItemInArray(
                event.container.data,
                event.previousIndex,
                event.currentIndex
              );
             else 

              const prev_idx = event.previousIndex;
              const curr_id = event.currentIndex;
              // Copy the data.
              event.container.data[curr_id] = event.previousContainer.data[prev_idx];
        
            
          
    

案例 2:将数据从列表复制到特定变量

drop(event: any) 
          // Copy the data to my-variable
                  const prev_idx = event.previousIndex;    
                  this.my-variable = event.previousContainer.data[prev_idx];
            
                
              
        

【讨论】:

以上是关于Angular CDK 拖放:不要移动源项目的主要内容,如果未能解决你的问题,请参考以下文章

重新实例化数据时,Angular CDK 拖放列表会中断

Angular CDK拖放 - 如何保持原始位置?

Angular Material、cdk、拖放、拖放和插入到 TextArea 字段的当前位置

Angular 嵌套拖放 / CDK 材质 cdkDropListGroup cdkDropList nested

Angular CDK拖放,保持顺序直到下降

CSS flexbox中的Angular CDK拖放问题