有没有办法中止 SlickGrid 异步渲染?

发布于 2024-09-13 03:08:49 字数 1247 浏览 0 评论 0原文

我有一个搜索页面,其结果在 SlickGrid 中呈现。这是一个执行onkeyup的ajax搜索,因此可以执行搜索,调用Slick.Grid实例的render,并在之前返回另一个结果第一个异步渲染完成。我想在第二个 ajax 请求返回时立即取消初始 render ,这样就不会同时发生两个 render 调用。

编辑示例

这就是我正在做的事情,并使用警报来跟踪执行顺序。

function setupGrid() {
    slickDataView = new Slick.Data.DataView();
    slickGrid = new Slick.Grid(slickGridDiv, slickDataView.rows, slickGridColumns, slickGridOptions);
    slickDataView.onRowsChanged.subscribe(function(rows) {
      slickGrid.removeRows(rows);
      slickGrid.updateRowCount();
      slickGrid.render();
    });
    slickDataView.onRowCountChanged.subscribe(function(args) {
      slickGrid.updateRowCount();
      slickGrid.render();
    });
} 

function performSearch() {   
    jQuery.get('searchPage.php', {MODEL_ID: userInputField.val()},
      function(results) {
        slickDataView.beginUpdate();
        alert(1);
        slickDataView.setItems(results);
        alert(2);
        slickDataView.endUpdate();
      }
    );
}

setupGrid();
userInputField.keyup(function() { performSearch(); });

当我在 userInputField 文本字段中快速连续输入两个数字时,我会按此顺序收到以下警报:

1
1
2

I have a search page whose results are rendered in a SlickGrid. It is an ajax search that executes onkeyup, so it's possible for a search to be performed, the Slick.Grid instance's render to be called, and have another result come back before the first asynchronous render completes. I'd like to cancel the initial render as soon as the second ajax request comes back so that there aren't two render calls taking place at the same time.

EDIT WITH EXAMPLE:

Here's what I'm doing, with alerts in place to track the execution order.

function setupGrid() {
    slickDataView = new Slick.Data.DataView();
    slickGrid = new Slick.Grid(slickGridDiv, slickDataView.rows, slickGridColumns, slickGridOptions);
    slickDataView.onRowsChanged.subscribe(function(rows) {
      slickGrid.removeRows(rows);
      slickGrid.updateRowCount();
      slickGrid.render();
    });
    slickDataView.onRowCountChanged.subscribe(function(args) {
      slickGrid.updateRowCount();
      slickGrid.render();
    });
} 

function performSearch() {   
    jQuery.get('searchPage.php', {MODEL_ID: userInputField.val()},
      function(results) {
        slickDataView.beginUpdate();
        alert(1);
        slickDataView.setItems(results);
        alert(2);
        slickDataView.endUpdate();
      }
    );
}

setupGrid();
userInputField.keyup(function() { performSearch(); });

I get the following alerts in this sequence when I type two numbers into the userInputField text field in quick succession:

1
1
2

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

徒留西风 2024-09-20 03:08:49

您的页面上一定还有其他内容。
您列出的示例是不可能的 - JavaScript 执行永远不会因事件触发而中断。当前代码执行完毕后,事件就会排队并由事件循环获取。您将在示例中看到的是 1212。

​​您将需要限制 AJAX 调用,并取消先前调用的回调,因为您的 AJAX 响应可能会乱序返回,并且旧的搜索结果可能会覆盖新的搜索结果。

There must be something else going on on your page.
The example you listed is impossible - JavaScript execution is never interrupted by an event getting fired. The event just gets queued up and picked up by the event loop after the current code is done executing. What you would see in your example, is 1212.

You will want to throttle the AJAX calls and also to cancel the callbacks from the previous calls since your AJAX responses may come back out of order and the older search results can override the newer ones.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文