Angular 7 拖放 - 动态创建拖放区 [英] Angular 7 Drag and Drop - Dynamically Create Drop Zones

查看:43
本文介绍了Angular 7 拖放 - 动态创建拖放区的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法动态创建拖放区?我在使用 ngFor 和 cdkDropList 时遇到了一些麻烦.

这是我的第一个列表和可拖动元素:

 

{{主题名称}}

这是我的第二个列表:

 

<div class="sub" cdkDrag *ngFor="让预约课.lessons">{{课程名称}}

现在,类为 'conta' 的 div 位于 *ngFor 内.

我想我的问题是我的第二个列表.如果我将一个元素从第二个列表拖动到列表一,它可以正常工作,但是如果我尝试将元素从列表一拖动到第二个列表中的任何列表实例,它无法识别该元素正在被拖动.演示在这里:

我在这里做错了吗?打字稿部分工作正常.

谢谢

解决方案

经过一整天的研究,我找到了 this 拉取请求.现在,由于我不知道如何将 cdkDropListGroup 集成到我的示例中,我决定创建一个 ID 数组,这些 ID 将添加到 [cdkDropListConnectedTo].

我的第二个列表的每个实例都将生成 ID,并且该 ID 将添加到具有合适前缀的数组中(在我的第二个列表中,在 cdkDropList 上):

addId 方法:

addId(i, j) {this.LIST_IDS.push('cdk-drop-list-' + i + '' + j);返回 i + '' + j;}

(cdk-drop-list- 是一个 ID 前缀.CDK 将此前缀放在每个具有 cdkDropList 属性的元素上)

所以,我的数组看起来像:

  • cdk-drop-list-00
  • cdk-drop-list-01
  • cdk-drop-list-02

现在,我将该数组传递给我的第一个列表中的 [cdkDropListConnectedTo]:

它完美无缺!

希望这能帮助任何有同样问题的人.另外,看看我提到的拉取请求,我的解决方案只是一种解决方法,cdkDropListGroup

可能有更好的解决方案

Is there a way to dynamically create drop zones? I'm having some troubles with ngFor and cdkDropList.

Here is my first list and draggable elements:

       <div class="subj-container" 
        cdkDropListOrientation="horizontal" 
        cdkDropList 
        #subjectList="cdkDropList"
        [cdkDropListData]="subjects"  
        [cdkDropListConnectedTo]="[lessonList]" 
        (cdkDropListDropped)="drop($event)"
        >
            <div class="subject" *ngFor="let subject of subjects" cdkDrag>
                {{subject.name}}
            </div>
        </div>

And here is my second list:

          <div class="conta" cdkDropList
                #lessonList="cdkDropList"
                [cdkDropListData]="appointment.lessons"
                [cdkDropListConnectedTo]="[subjectList]"
                (cdkDropListDropped)="drop($event)">
                    <div class="sub" cdkDrag *ngFor="let lesson of appointment.lessons">
                        {{lesson.name}}
                </div>
           </div>

Now, div with class 'conta' is inside of a *ngFor.

My problem is, I suppose, with my second list. If I drag an element from second list to list one, it works normally, but if I try to drag element from list one to any instance of list in second list, it can't recognize that the element is being dragged. Demo here:

Am I doing something wrong here? The typescript part is working fine.

Thanks

解决方案

After a full day of research, I found this pull request on Angular CDK repository on Github. Now, since I did not know how to integrate cdkDropListGroup into my example, I decited to create an array of IDs which will be added to [cdkDropListConnectedTo].

Each instance of my second list will have generated ID, and that ID will be added to array with suitable prefix (in my second list, on cdkDropList):

<div cdkDropList
      [attr.id]="addId(i, j)"
      [cdkDropListData]="appointment.lessons"
      [cdkDropListConnectedTo]="[subjectList]"
      (cdkDropListDropped)="drop($event)"
>

addId method:

addId(i, j) {
    this.LIST_IDS.push('cdk-drop-list-' + i + '' + j);
    return i + '' + j;
}

(cdk-drop-list- is an ID prefix. CDK places this prefix on every element with cdkDropList attribute)

So, my array will look like:

  • cdk-drop-list-00
  • cdk-drop-list-01
  • cdk-drop-list-02
  • etc.

Now, I pass that array to [cdkDropListConnectedTo] in my first list:

<div class="subj-container" 
    cdkDropListOrientation="horizontal"
    cdkDropList 
    #subjectList="cdkDropList"            
    [cdkDropListData]="subjects" 
    [cdkDropListConnectedTo]="LIST_IDS"
    (cdkDropListDropped)="drop($event)"
>

And it works flawlessly!

Hope this will help anybody with the same problem. Also, take a look at the pull request I mentioned, my solution is only a workaround, there is probably a better solution with cdkDropListGroup

这篇关于Angular 7 拖放 - 动态创建拖放区的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆