2017-08-01 102 views
1

我使用Guriddo jqGrid 5.2.1。我已經定義了一個jsonReader來處理由URL返回的數據的非標準格式:jqgrid:與beforeProcessing和loadonce問題

jsonReader : { 
      root:"payload.rows", 
      page: "payload.page", // the current page 
      total: "payload.total", // the total # of pages 
      records: "payload.records" // the total # of records 
     }, 

電網也有loadonce設置爲true,使得所有的數據被加載一次。這使我可以讓網格處理排序,而不是從服務器請求排序數據。行中的一個輸入字段是以毫秒錶示的日期。我所定義的beforeProcessing函數來處理轉換的時間在每行中,以是能夠適當地格式化的值:

beforeProcessing: function (data) { 

      for(var i = 0; i < data.payload.rows.length; i++) { 
       var d = new Date(data.payload.rows[i].ihw); 
       data.payload.rows[i].ihw = d; 
      } 

     }, 

當數據被初始檢索此工作得很好。不過,我注意到,只要我點擊一列進行排序,即使loadonce設置爲true,也會調用beforeProcessing。我可以更改代碼以使用formatter(如this post)中的日期來格式化日期。不過,我還有其他數據操作需求,例如,我想爲行中的其他三個字段串聯的每一行添加一個新字段。當使用jsonReader時,輸入數據似乎會轉換爲標準的jqgrid格式,以便下一次執行beforeProcessing(例如,在排序時)beforeProcessing代碼錯誤,因爲現在數據的格式與以前不同。是否有一個事件我可以使用,只能運行一次,在數據最初從服務器中檢索後?或者我需要在beforeProcessing中設置一個JavaScrpt變量,表示數據已經處理過一次,並且在後續調用中跳過處理?

+0

看來這個問題是特定商業[Guriddo jqGrid的JS]設置相同的事件,以空(HTTP ://guriddo.net/?page_id = 103334),你使用。 [免費jqGrid](https://github.com/free-jqgrid/jqGrid)和舊版jqGrid(版本<= 4.7)都沒有問題。 – Oleg

+0

如果你想繼續使用商業的Guriddo jqGrid JS,那麼我建議你在代碼中插入'if(this.p.datatype ===「json」){/ * for循環* /}'' beforeProcessing'。它允許您在jqGrid處理數據之前對從服務器*返回的數據進行一些修改。 – Oleg

回答

0

當數據類型爲本地時,舊代碼在處理事件之前沒有考慮到 - 這是修復此錯誤並將beforeProcessing添加到所有數據類型的原因。

由於選項loadonce設置爲true,因此您將數據類型從json更改爲local,但beforeProcessing會像您所提到的那樣傳遞不同的數據。

一個可能的解決方案是設置一個標誌,只有一次執行這個代碼或事件

beforeProcessing: function (data) { 

     for(var i = 0; i < data.payload.rows.length; i++) { 
      var d = new Date(data.payload.rows[i].ihw); 
      data.payload.rows[i].ihw = d; 
     } 
     this.p.beforeProcessing = null; 

    },