2017-08-01 4 views
1

Ich benutze Guriddo jqGrid 5.2.1. Ich habe ein jsonReader definiere das Nicht-Standardformat der Daten zu handhaben, indem die URL zurückgegeben wird:jqgrid: Problem mit beforeProcessing und 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 
     }, 

Das Gitter hat auch loadonce Satz true, so dass alle Daten einmal geladen wird. Dies ermöglicht es mir, dass das Gitter die Sortierung übernimmt, anstatt sortierte Daten vom Server anzufordern. Eines der Eingabefelder in den Zeilen ist ein Datum in Millisekunden. I definiert eine beforeProcessing Funktion zu handhaben in jeder Zeile das Datum Umwandeln eines Wertes zu sein, der richtig formatiert werden können:

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; 
      } 

     }, 

Dies hat gut funktioniert, wenn die Daten ursprünglich abgerufen. Allerdings habe ich festgestellt, dass beforeProcessing aufgerufen wird, wenn ich auf eine Spalte zum Sortieren klicken, obwohl loadonce auf true festgelegt ist. Ich kann den Code ändern, um die Formatierung des Datums mit einer formatter wie in this post zu behandeln. Ich habe jedoch andere Datenmanipulationsanforderungen, bei denen ich beispielsweise jeder Zeile, die eine Verkettung von drei anderen Feldern in der Zeile darstellt, ein neues Feld hinzufügen möchte. Wenn jsonReader verwendet wird, scheinen die eingehenden Daten in das Standardformat jqgrid umgewandelt zu werden, so dass das nächste Mal beforeProcessing (z. B. bei einer Sortierung) die Codefehler beforeProcessing ausgeführt wird, da die Daten jetzt in einem anderen Format als zuvor vorliegen . Kann ich ein Ereignis verwenden, das nur einmal ausgeführt wird, nachdem die Daten ursprünglich vom Server abgerufen wurden? Oder muss ich eine JavaScrpt-Variable in beforeProcessing festlegen, die angibt, dass die Daten einmal verarbeitet wurden, und Verarbeitung in nachfolgenden Aufrufen überspringen?

+0

Es scheint, dass das Problem für kommerzielle spezifisch ist [Guriddo jqGrid JS] (http : //guriddo.net/?page_id=103334), die Sie verwenden. Weder [free jqGrid] (https://github.com/free-jqgrid/jqGrid) noch altes jqGrid (in Versionen <= 4.7) sollte das Problem haben. – Oleg

+0

Wenn Sie weiterhin kommerzielle Guriddo jqGrid JS verwenden möchten, dann würde ich empfehlen, 'if (this.p.datatype ===" json ") {/ * die for-Schleife * /}' in den Code von 'einzufügen beforeProcessing'. Sie können einige Änderungen an den Daten vornehmen, die von * dem Server * zurückgegeben werden, bevor die Daten von jqGrid verarbeitet werden. – Oleg

Antwort

0

Der alte Code berücksichtigt das Ereignis beforeProcessing nicht, wenn der Datentyp lokal war - das war der Grund, diesen Fehler zu beheben und beforeProcessing allen Datentypen hinzuzufügen.

Da die Option loadonce auf true gesetzt ist, wird der Datentyp von json in local geändert, aber zur beforeProcessing werden verschiedene Daten übergeben, wie Sie bereits erwähnt haben.

Eine mögliche Lösung ist ein Flag setzen nur einmal diesen Code auszuführen oder das gleiche Ereignis auf null im Falle gesetzt

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; 

    },