【问题标题】:Change order of list items using drag and drop使用拖放更改列表项的顺序
【发布时间】:2019-02-06 02:28:29
【问题描述】:

我使用以下 html 和 ts 将列表项从一个 div 拖放到另一个 div。

HTML:

<div class="listArea">
   <h4> Drag and Drop list in Green Area: </h4>
   <ul class="unstyle">
      <li id="drag1" draggable="true" (dragstart)="drag($event)">
          i am list 1
      </li>
      <li id="drag2" draggable="true" (dragstart)="drag($event)">
          i am list 2 
      </li>
      <li id="drag3" draggable="true" (dragstart)="drag($event)">
          i am list 3
      </li>
      <li id="drag4" draggable="true" (dragstart)="drag($event)">
          i am list 4
      </li>
   </ul>
</div>
<div class="buildArea" id="div1" (drop)="drop($event)" (dragover)="allowDrop($event)">
   <h4> Drop Here </h4> 
</div>

Typescript 包含以下内容:

  allowDrop(ev) {
    ev.preventDefault();
  }

  drag(ev) {
    ev.dataTransfer.setData("text", ev.target.id);
  }

  drop(ev) {
    ev.preventDefault();
    var data = ev.dataTransfer.getData("text");
    ev.target.appendChild(document.getElementById(data).cloneNode(true));
  }

它来自 Html5 拖放,我可以将列表项从具有类 listArea 的 div 拖放到具有类 buildArea 的 div。

删除列表项后,用户可以更改在 buildArea div 中删除的列表项的顺序。

例如,我是列表 1、2、3、4、5 的给定顺序可能会更改为 2、4、5、3、1 之类的任何顺序或用户想要的任何顺序。

到目前为止,我只使用了 angular 和 typescript,没有添加任何第三方插件,我还需要 没有任何第三方或 jquery 的结果。

我也四处寻找,但无法获得正确的解决方案,因此请帮助我实现删除列表中的顺序更改。

stackblitz 链接是 https://stackblitz.com/edit/angular-wyimor

【问题讨论】:

  • 您可以将数组绑定到目标列表。每当用户放入新项目时,您可以将数组排序为您想要的任何顺序。
  • 您想要所有元素按顺序排列吗?
  • @UnluckyAj,如果用户删除列表,它会被列表的最后一个附加,如果假设用户以错误的方式删除订单,他可以更改他想要的顺序。 . 就像列表项的交换..
  • @wannadream,您能否提供一种解决方案,因为我是这种情况的新手。

标签: javascript angular html typescript drag-and-drop


【解决方案1】:

在您的放置区域中,将列表项绑定到一个数组。

<div class="buildArea" id="div1" (drop)="drop($event)" (dragover)="allowDrop($event)">
    <h4> Drop Here </h4>
    <ul>
        <li *ngFor="let item of targetItems [id]="item.id">{{item.text}}</li>
    </ul>
</div>

在组件类中:

targetItems: Array<TargetItem> = [];
....
drop(ev) {
    ev.preventDefault();
    let id = ev.dataTransfer.getData("text");
    let text = document.getElementById(id).innerText;
    this.targetItems.push({id: id, text: text});
    this.targetItems.sort((a, b) => {
        // Implement your own sorting logic
        // e.g., return a.id - b.id;
    });
}

为目标项目定义一个接口:

interface TargetItem {
    text: string;
    id: number;
}

【讨论】:

  • 它显示以下错误,类型“(a:TargetItem,b:TargetItem)=> void”的参数不可分配给类型“(a:TargetItem,b:TargetItem)=>数字'。类型“void”不可分配给类型“number”。
  • @wanadream,我已经实现了你的代码,但它显示错误,你可以看到编辑后的代码,stackblitz.com/edit/…
  • 排序函数需要一个数字的返回值。您可以在此处进行自己的比较,并返回 1、0 和 -1。您可以尝试'return a.id - b.id;',将id从类型字符串更改为数字。
猜你喜欢
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2020-07-04
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多