【问题标题】:How does Trello handle rearrangement of cards, lists, checklists etcTrello 如何处理卡片、列表、清单等的重新排列
【发布时间】:2015-06-29 18:07:57
【问题描述】:

我正在制作一个必须列出可以重新排列的事物的应用程序。

Trello 做得很好,它允许我们重新排列所有内容,从列表到卡片和清单。它是怎么做到的?

我检查了他们在重新排列时进行的 API 调用,结果发现他们正在从前端发送一个密钥“pos”。每次我重新排列卡片时,该卡片的 ID 都会用于 PUT 请求,并更新“pos”值。

这是重新排列之前的列表:

{
    "id": "553750612a364775ded5f841",
    "name": "test again",
    "closed": false,
    "idBoard": "55374f01f73ace7afec03698",
    "pos": 131071
}

我将它拖放到其他列表之前,对https://trello.com/1/lists/553750612a364775ded5f841 进行API 调用并发送新的pos:32767。响应如下:

{
    "id": "553750612a364775ded5f841",
    "name": "test again",
    "closed": false,
    "idBoard": "55374f01f73ace7afec03698",
    "pos": 32767.5
}

Trello 是如何做到的?

【问题讨论】:

    标签: javascript mongodb trello


    【解决方案1】:

    每个项目都有一个pos(一个JavaScript 数字,所以是双精度浮点数)。然后,它们通过pos排序呈现。

    添加新项目时,pos 取决于它在列表中的位置:

    • 列表底部 - 当前列表中的最大 pos + 一个缓冲区(我认为使用了 1024
    • 列表顶部 - 当前列表中的最小 pos 除以二
    • 列表中间 - 两个相邻项目的 pos 的平均值

    中间选项由客户指定;顶部/底部可以由客户端分配,也可以作为字符串"top""bottom" 传递给服务器,在这种情况下服务器将执行逻辑。

    在服务器上,将pos 分配给新项目后,如上所示,检查项目与其最近的邻居的邻接性 - 如果它们之间的距离小于最小距离(我相信使用.01 ),它们会散开(可能会级联增加整个列表的 pos)。

    我认为这不是理想的方式,但 Trello 就是这样做的。

    【讨论】:

    • 再次感谢@aaron。您在为社区回答 trello 问题方面非常有帮助。
    • @Aaron Dufour 理想的方式是什么?
    • @ProcedurallyGenerated 我有一段时间没有考虑过这个问题,但是如果您允许负数,您可以将第一张卡放在 0 处,并在添加到底部时添加一些常量缓冲区并减去相同的缓冲区当添加到顶部时,只有当一堆东西被插入到中间时你才会被卡住(这个操作在大列表上可能很昂贵,所以只需添加到顶部就可以轻松触发列表有点悲伤)。
    猜你喜欢
    • 2020-07-08
    • 2015-09-30
    • 1970-01-01
    • 2012-04-06
    • 2021-11-19
    • 2014-01-05
    • 2018-12-23
    • 2021-04-05
    • 2013-07-23
    相关资源
    最近更新 更多