我認爲這個用戶提出了我所問的同一個問題,但推動他的問題的原因是不同的,所以他接受了不同的解決方案。我需要做什麼,他最初問:自動取消jqGrid請求
Automatically cancelling jqgrid request
我的jqGrid有一個搜索工具欄(即出現下面的列標題,但上面的數據輸入字段)。大多數列都有下拉列表(stype = select),列出了該列的可用過濾選項,頂部有一個「全部」選項。用填充我的jqGrid的JSON數據響應的服務器端代碼非常複雜,因此速度有點慢,特別是當過濾條件沒有太多的時候。這意味着如果用戶選擇「全部」,則可能需要幾秒鐘才能顯示結果。這本身就很好,但如果用戶在響應返回之前做出另一個篩選器選擇,則網格不會取消現有的請求,也不會提交新的請求,因此在之後的某個點處,用戶進行第二次選擇,網格會更新以顯示第一個選擇的響應。此外,網格自動更新,當你選擇過濾器時,爲了讓它顯示你想要的數據,你必須改變你的選擇,等待它加載,然後再改回來。
這裏是我試過到目前爲止:
$(document).ready(setupGrid);
var currentGridRequest;
function setupGrid() {
var grid = $("#grid").jqGrid({
...
loadError: function(xhr, status, error) {
currentGridRequest = undefined;
},
loadComplete: function(data) {
currentGridRequest = undefined;
},
loadBeforeSend: function(xhr, settings) {
if (currentGridRequest !== undefined) {
currentGridRequest.abort();
}
currentGridRequest = xhr;
}
});
}
我的問題是,loadBeforeSend事件實際上並沒有火是否已存在飛行中的請求。我從事件文檔頁面(http://www.trirand.com/jqgridwiki/doku.php?id=wiki:events)嘗試了其他事件:beforeRequest和jqGridToolbarBeforeSearch都顯示相同的行爲。
如何取消正在進行的請求並根據用戶最近的選擇繼續進行搜索?這是jqGrid中的錯誤嗎?我最初在版本4.2上遇到過這個問題;我剛剛升級到4.4.4,這種行爲沒有任何變化。
看着jqGrid代碼,我看到的行爲似乎是不可避免的,無需更改jqGrid代碼本身。 jqGrid在每個請求的開始處設置一個標誌(ts.grid.hDiv.loading),並在最後清除它;當設置此標誌時,不會提交新的過濾標準,也不會觸發事件。
我也考慮過修改我的JSON響應,以便它包含請求標準,然後編寫一些JS代碼來將響應與當前條件選擇進行比較。如果它們不匹配,我會忽略該響應並且不將其呈現給網格。由於jqGrid甚至不提交第二組標準,該選項不在表格中(即使我能解決這個問題,我目前的方法似乎也是可取的)。