2012-11-26 167 views
0

我知道這個答案:How do I add a cancel button to my jqgrid?,我試圖實現類似的東西,雖然沒有一個按鈕來觸發取消。我有一個網頁加載頁面加載(搜索默認加載沒有條件),我希望能夠取消默認的空條件搜索時,用戶實際執行搜索條件。由於我不需要按鈕,因此我試圖簡化解決方案,只需跟蹤loadBeforeSend方法中的xhr請求,並在xhr加載網格時如果它不爲空就放棄xhr。代碼:自動取消jqgrid請求

var gridXhr; 
function getGridData() { 
    var searchParms = ...; 
    var colHeaders = [...]; 
    var colDefinitions = [...]; 
    if (gridXhr != null) { 
     alert(gridXhr.readyState); 
     gridXhr.abort(); 
     gridXhr = null; 
    } 
    $('#grid').jqGrid('GridUnload'); 
    $('#grid').jqGrid({ 
     defaults: {...}, 
     autowidth:true, 
     url: "<%= Page.Request.Path %>/ExecuteSearch", 
     mtype: 'POST', 
     ajaxGridOptions: { contentType: "application/json" }, 
     postData: searchParms, 
     datatype: "json", 
     prmNames: { 
      nd: null, 
      rows: null, 
      page: null, 
      sort: null, 
      order: null 
     }, 
     jsonReader: { 
      root: function (obj) { return obj.d; }, 
      page: function (obj) { return 1; }, 
      total: function (obj) { return (obj.d.length/20); }, 
      records: function (obj) { return obj.d.length; }, 
      id: 'CatalogID', 
      cell: '', 
      repeatitems: false 
     }, 
     loadonce: true, 
     colNames: colHeaders, 
     colModel: colDefinitions, 
     caption: "Search Results", 
     pager: 'searchPaging', 
     viewrecords: true, 
     loadBeforeSend: function (xhr) { 
      gridXhr = xhr; 
     }, 
     loadError: function (xhr, status, error) { 
      gridXhr = null; 
      if (error != 'abort') { 
       alert("Load Error:" + status + "\n" + error); 
      } 
     }, 
     loadComplete: function() { 
      gridXhr = null; 
     }, 
     multiselect: <%= this.MultiSelect.ToString().ToLower() %>, 
     multiboxonly: true 
    }).setGridWidth(popWidth); 
} 

我遇到的問題是後續執行jqGrid不起作用。 loadError函數被觸發,並有一個錯誤(第三個參數)「中止」。我是否需要在loadBeforeSend方面做更多/不同的工作,就像在其他答案中做的那樣?

此外,奧列格在他的示例代碼myGrid[0].endReq();中提到,我可以在文檔中找不到那個 - 該函數是否存在?

+0

對不起,但我無法關注你。我不明白你的意思下的「我希望能夠取消該默認空標準搜索時,用戶實際執行搜索與標準」。哪個「默認空標準搜索」是你的意思?你使用'loadonce:true'。所以它只會被**完成一次**初始請求到服務器到'url:「<%= Page.Request.Path%>/ExecuteSearch」'。以後的所有搜索,排序和分頁都將在本地執行,並且無需向服務器發送Ajax請求。所以你不能取消任何Ajax請求,因爲沒有請求會被髮送更多。你的意思是什麼? – Oleg

+0

通過調用document.ready函數中的「getGridData()」函數加載網格。該初始網格加載在搜索時沒有條件執行,返回所有記錄。向用戶提供縮小搜索範圍的輸入,並且可以填充這些輸入並單擊「搜索」按鈕,該搜索按鈕使用填充的搜索條件重新運行getGridData函數,卸載並重新生成網格。沒有搜索標準的初始執行是我希望在執行後續搜索時中止的那個。 –

回答

0

如果我理解正確的話,你只需要更改的行

datatype: "json", 

喜歡的東西

datatype: isSearchParamEmpty(searchParms) ? "local" : "json", 

在你應該datatype: "local"而不是datatype: "json"創建網格換句話說空搜索條件的情況下。網格將保持空白。

此外,你應該考慮創建的jqGrid 只有一次如果colDefinitionscolHeaders會留在不同的搜索條件不變。與其重新創建網格,您只能更改postData並致電trigger("reloadGrid")

+0

謝謝,這將實現目標。 –

+0

@TheRascalKing:不客氣! – Oleg