2010-08-05 116 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

相關問題