Jquery-UI 可排序列表与 Meteor 模板中的反应式更新配合不佳

2024-02-07

我正在尝试以 JQuery-UI 中描述的方式实现可排序的对象列表http:// Differential.com/blog/sortable-lists-in-meteor-using-jquery-ui http://differential.com/blog/sortable-lists-in-meteor-using-jquery-ui.

但是,我不是对单独文档的列表进行排序,而是对嵌入在单个文档中的对象列表进行排序。也就是说,我有一个像这样的文档:

{  name: "Name of this Rolodex",
   cards: [{name: "...", rank: 0, id: "some-unique-id"},
           {name: "...", rank: 1, id: "some-other-unique-id"}, ... ]
}

我只是想让卡片可以排序。我的模板如下 - 它传递了一个 Rolodex 作为上下文:

<template name="rolodex">
  Rolodex Name: {{name}}
  <div class="cards-list">
    {{#each sortedCards}}
      {{> cardTemplate}}
    {{/each}}
  </div>
</template>

以及辅助 JS 文件:

Template.rolodex.helpers({
  sortedCards: function() {
    return this.cards.sort(function(cardA, cardB) {
      return cardA.rank - cardB.rank;
    });
  }
});

Template.rolodex.rendered = function() {
  this.$(".cards-list").sortable({
    stop: function(e, ui) {
      // Get dragged HTML element and one immediately before / after
      var el = ui.item.get(0)
      var before = ui.item.prev().get(0)
      var after = ui.item.next().get(0)

      // Calculate new rank based on ranks of items before / after
      var newRank;
      if(!before) {
        // First position => set rank to be less than card immediately after
        newRank = Blaze.getData(after).rank - 1;
      } else if(!after) {
        // Last position => set rank to be more than card immediately after
        newRank = Blaze.getData(before).rank + 1;
      } else {
        // Average before and after
        newRank = (Blaze.getData(after).rank + 
                   Blaze.getData(before).rank) / 2;
      }

      // Meteor method that updates an attribute for a single card in a
      // Rolodex based on IDs for the Rolodex and Card
      Meteor.call('cards/update',
                  Blaze.getData(ui.item.parent().get(0))._id, // Rolodex ID
                  Blaze.getData(el).id, // Card ID
                  {rank: newRank});
    }
  });
};

我遇到的问题是,将卡片排序到其预期位置后,DOM 将更新为卡片处于新的错误位置。不过,服务器存储了正确的排名,刷新页面会导致卡片列在正确的位置(至少在尝试另一种排序之前)。

我对正在发生的事情的最佳猜测是,Meteor 的模板系统似乎不理解 JQuery-UI 已经移动了 DOM 元素,并且以错误的顺序反应性地更新了我的模板。

例如,假设我的卡片是:A、B、C。我移动 C,这样我们现在就有了 C、A、B。JQuery-UI 相应地更新 DOM 并触发一个事件,导致 C 的排名更改为小于作为。

然而,Meteor 并不知道 DOM 已被 JQuery-UI 更改。然而,它确实看到了 C 级的变化,并根据关于列表顺序的先前假设来反应性地更新列表的顺序。在这种情况下,我们最终得到 B、C、A。

关于我在这里做错了什么有什么建议吗?


Meteor/Blaze 使用_id属性来识别数据对象并将它们链接到 DOM 元素。这不仅适用于 Collection 游标返回的文档数组,还适用于任何对象数组。所以在上面的问题中,问题是我使用了id识别每张卡的值而不是_id。交换id to _id修复了该问题并允许 Blaze 正确更新 DOM,即使 DOM 之前已被 JQuery-UI 的可排序插件修改过。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jquery-UI 可排序列表与 Meteor 模板中的反应式更新配合不佳 的相关文章

随机推荐

  • Caffe:如何通过代码获取`solver.prototxt`参数?

    我想访问solver prototxt参数如base lr 基础学习率 或weight decay来自Python代码 有什么方法可以从solver net目的 谢谢 根据本教程 http nbviewer jupyter org gith
  • iOS 15 safari 工具栏现在在元素内滚动时隐藏

    在 iOS 15 上 无论您有顶部还是底部工具栏 在元素内滚动都会导致窗口调整大小 工具栏消失 在 iOS 14 上 只有当主体滚动时才会发生这种情况 请参阅下面的 gif 注意 黄色区域是一个带有溢出滚动的 div 并且主体不滚动 iOS
  • 使用 JavaScript 截断文本并附加省略号

    如何截断字符串并附加省略号 我想截断类似的东西 this is a very long string to this is a ve function truncate input if input length gt 5 return i
  • 检查 Activity 是否正在从 Service 运行

    怎样才能一个Service检查其应用程序之一是否Activity正在前台运行 使用以下方法和您的包名称 如果您的任何活动位于前台 它将返回 true public boolean isForeground String myPackage
  • urlopen() gbk 页面时 Python 中的编码问题

    我的代码在这里 coding utf 8 if name main from urllib2 import urlopen url http iccna blog sohu com 164572951 html data urlopen u
  • java中pdf解析为文本

    我有一个阿拉伯语 PDF 我想使用 Java 将其解析为文本文档 我已经尝试了很多次 英语单词解析成功 但阿拉伯语单词解析失败 谁能推荐一个可以正确转换阿拉伯语单词的解决方案 我想到了几个图书馆 阿帕奇蒂卡 http tika apache
  • onChange 是一个延迟字符 - Hooks

    我是 React 和 Hooks 的新手 我创建了一个简单的搜索栏 用户可以在其中输入一些文本 然而 如果我console log之后的状态onChange 它总是落后一个字符 例如 如果我输入 披萨 console log鞋子 披萨 我的
  • 循环依赖——什么时候终止?

    我无法理解 python 是如何管理的imports 假设我有以下应用程序结构 application application py model init py user py 假设application py文件在创建数据库后导入模型模块
  • 使用 jQuery 将参数发送到 Java Server Pages (JSP)

    我想向 JSP 发送不同的参数 是否可以在 jQuery 中向 JSP 发送多个参数 因为jQuery是客户端 JSP是服务器端 告诉我 您可以通过ajax请求传递参数 例如 ajax type POST url userNameCheck
  • EventWaitHandle 是否有任何隐式 MemoryBarrier?

    我是这个网站的新手 所以如果我没有以可接受的方式发帖 请告诉我 我经常按照下面的示例编写一些代码 为了清楚起见 省略了诸如 Dispose 之类的内容 我的问题是 是否需要如图所示的挥发物 或者 ManualResetEvent Set 是
  • 双重提交 Cookie 和多个选项卡?

    The 双重提交cookie https www owasp org index php Cross Site Request Forgery 28CSRF 29 Prevention Cheat Sheet Double Submit C
  • 图像上方的文本 CSS Z 索引不起作用

    我试图强制文本位于图像上方 但是 它不想工作 我已经尝试在文本上设置 z index 100 在图像上设置 100 但它仍然不起作用 主要 HTML div class menu defaults menu overlay div clas
  • Windows 8 Metro 风格应用程序和窗口挂钩

    我对 window hooks 和 Windows 8 Metro 应用程序都很陌生 我想开发一个后台服务 流程 检查用户刚刚点击启动的 Metro 应用程序的 属性 例如播放音乐的应用程序 文本文档创建应用程序 根据找到的属性 激活其他应
  • 自定义 sbt 任务按标签运行测试

    我想做一些 sbt 自定义任务来按标签运行测试 scalatest 例如 现在我可以在 sbt 控制台中运行它 sbt test only n UnitTests 我想运行这个做类似的事情 sbt test unit or somethin
  • pexpect 发送光标移动

    如何使用 pexpect 发送光标移动 如上 下 左 右键 下面的示例是自动化 elink 它使用向上 向下键选择页面上的不同链接 from pexpect import spawn child spawn elinks http pyth
  • git:忽略*受*版本控制的文件

    A gitignorefile 允许忽略版本控制中的文件 我们有不同的情况 我们想在存储库中放置一些配置文件 这些文件需要根据每台机器进行更改 例如数据库访问信息 我们确实希望将它们作为占位符进行分发 因此我们将它们包含到存储库中 但是 稍
  • 正则表达式 - 贪婪量词[重复]

    这个问题在这里已经有答案了 我真的很纠结这个问题 import java util regex class Regex2 public static void main String args Pattern p Pattern compi
  • 数组索引越界异常[重复]

    这个问题在这里已经有答案了 一直在环顾四周 看看是否有什么可以帮助我 但我不太明白人们在回答什么 而我所理解的任何东西似乎都不能解决问题 所以基本上正如标题所说 我遇到了数组索引越界异常 但我不知道为什么 任何帮助是极大的赞赏 Code i
  • 如何实现高效的 WhenEach 来传输 IAsyncEnumerable 任务结果?

    我正在尝试使用以下提供的新工具更新我的工具集C 8 https learn microsoft com en us dotnet csharp whats new csharp 8 一种似乎特别有用的方法是Task WhenAll http
  • Jquery-UI 可排序列表与 Meteor 模板中的反应式更新配合不佳

    我正在尝试以 JQuery UI 中描述的方式实现可排序的对象列表http Differential com blog sortable lists in meteor using jquery ui http differential c