2010-08-05 76 views
0

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

与实例编辑:

这里有我在的地方,跟踪执行顺序做什么,与alert秒。

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 
+0

您可以详细说明如何让这种行为发生? 1)浏览器JS执行是单线程的,所以没有任何事情可以在字面上同时发生。 2)对于grid.render()的API级调用几乎在所有情况下都会导致对renderRows()的同步调用,因为在释放键盘键时滚动位置没有改变。 – Tin 2010-08-05 06:14:10

回答

1

必须有别的东西在页面上怎么回事。 您列出的示例是不可能的 - JavaScript执行不会因被触发的事件而中断。在当前代码执行完毕后,事件就会排队等待并由事件循环取回。你会看到在你的例子中,是1212.

你会想要扼杀AJAX调用,也取消从以前的调用回调,因为你的AJAX响应可能会回来的顺序和旧的搜索结果可以覆盖新的。

+0

小改正:只有在第一次Ajax调用时调用.setItems()引发异常时才有可能。 – Tin 2010-08-05 15:55:51

+0

虽然Firefox不抱怨,IE8是给以下异常数据视图的refreshIdxById方法: 消息:“items.length”为空或不是对象 行:65 字符:28 代码:0 URI: http://localhost/javascript/slickgrid/slick.model.js – 2010-08-05 16:50:58

+0

@Tin:我正在缓存XMLHttpRequest并在运行新搜索之前中止它,如果它正在进行中,但这似乎并不妨碍双重呈现。我正在进一步研究,看看我的代码中是否有其他问题。 – 2010-08-05 16:53:23

相关问题