【问题标题】:Why does my tablesorter keep caching my old rows?为什么我的 tablesorter 不断缓存我的旧行?
【发布时间】:2012-09-19 22:11:33
【问题描述】:

我正在使用 tablesorter 对我的一个页面上的网格进行排序。我每 10 秒进行一次 AJAX 调用以获取更新的股票信息,并相应地更新我的网格。这么多工作,但我无法让我的排序选项正确缓存。相反,我似乎已经缓存了排序,但是当我这样做时,tablesorter 也会缓存我以前的行,并将它们与新的、已排序的行集一起显示。

例如,我的初始网格有 10 行数据。我在第二列排序。 10 秒后,一组新的 10 行进入,但我最初的 10 行仍然显示,即使我已经清空它们。我已经研究遍了,我似乎无法找到答案。

如果我根本不排序,并且我没有调用“sorton”的触发器,我会根据需要得到我的 10 行,但这些行当然没有排序。如果我将该触发器称为“sorton”,我的数据会被排序,但每次调用该函数时我都会获得 10 行新行(总共 20 行,然后总共 30 行,等等)。

这是我的 AJAX 调用中的代码:

if (myResult.Data.length > 0) {
    $.each(myResult.Data, function() {
        myRows += "<tr><td>" + this.column1 + "</td><td>" + this.column2 + "</td></tr>";
    });
    $("#myTBody").empty();
    //    $("#myTBody").append(myRows);    //tried this first
    //    $("#myTable").trigger("update"); // combined with this
    $("#myTBody").append(myRrows).trigger("update");
    var sorting = $("#myTable")[0].config.sortList;
    $("#myTable").trigger("sorton", [sorting]);
}

【问题讨论】:

    标签: tablesorter


    【解决方案1】:

    虽然这篇文章很旧,但以防万一有人像我一样正在寻找原始表格排序器的修复程序,我通过以下“延迟”方式触发 sorton 来解决此问题。

    $("#myTBody").append(myRrows).trigger("update");
    var sorting = $("#myTable")[0].config.sortList;
    setTimeout(function () {
        $("#myTable").trigger("sorton", [sorting]);
    }, 100);
    

    这样做的原因是因为原始tablesorter中的update函数不会立即更新缓存。在调用 update 方法后 1ms 更新它。因此,sorton 无法立即获取更新的缓存。这是我看完JS原代码后得出的结论,如有错误请指正。

    演示:http://jsfiddle.net/eY8uH/692/

    【讨论】:

    • 这对我也有用.. 下面来自 Saran 的答案没有。
    【解决方案2】:

    嗯,这似乎是原始 tablesorter (demo) 的问题。

    抱歉,我不记得更新期间缓存没有被清除的原因;但这个问题在我的fork of tablesorter (demo) 中没有发生。

    【讨论】:

    • 我只是看看原始的tablesorter JS代码。在更新函数中,它在 setTimeout 函数中调用cache = buildCache(me);,该函数将在 1ms 后执行。这会导致 sorton 在更新缓存之前使用缓存。因此,如果我在 100 毫秒后触发我的sorton,例如我触发了update,那么我可以完成排序,而无需在结果中附加额外的行。如果我错了,请纠正我。
    • 你的 fork 中存在相同的缓存问题(由更新 --> sorton 引起)。
    【解决方案3】:

    不使用超时的解决方案:

    $("#myTBody")
      .append(myRrows);
    $("#myTable")
      .trigger("update")
      .trigger("sorton", [$("#myTable")[0].config.sortList])
      .trigger("appendCache");
    

    基于:https://stackoverflow.com/a/2013571/451962

    【讨论】:

      【解决方案4】:

      旧帖子,但最近遇到了这个问题, 对我来说这有效

      $("#myTable")[0].config.cache = null;
      $("#myTable").trigger("sorton");
      

      它只是保留缓存,要么我找不到任何合理的标志来避免它,所以我将它设置为 null

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-24
        • 2017-08-20
        • 1970-01-01
        • 2013-04-19
        • 2014-10-21
        • 2012-07-30
        • 2014-09-06
        • 1970-01-01
        相关资源
        最近更新 更多