Sollte man ersetzen die Verwendung addJSONData von jqGrid die Verwendung von setGridParam () und trigger('reloadGrid')?
Schrieb ich vor kurzem eine Antwort auf die Frage "jqGrid display-default "laden" - Meldung, wenn Aktualisierung einer Tabelle /auf benutzerdefinierte update". Beim schreiben der Antwort, die ich dachte,: warum nutzt er die addJSONData() Funktion zum aktualisieren von Daten in der grid-anstelle der änderung der URL mit Bezug auf setGridParam() und erfrischende jqGrid Daten mit Bezug auf trigger('reloadGrid')? Am Anfang wollte ich empfehlen, mit 'reloadGrid', aber nach zu denken, über diese habe ich verstanden, dass ich nicht ganz sicher bin, was der beste Weg ist. Mindestens, ich kann nicht erklären, in zwei Sätzen, warum ich lieber den zweiten Weg. Also habe ich beschlossen, dass es ein Interessantes Thema der Diskussion.
Also um genau zu sein: Wir haben eine typische situation. Wir haben eine web-Seite mit mindestens einem jqGrid und einige andere Steuerelemente, wie combo-Boxen (wählt), Checkboxen usw.. die geben dem Benutzer die Möglichkeiten, den Umfang zu ändern, die auf Informationen in jqGrid. In der Regel definieren wir einen event-handler wie jQuery("#selector").change(myRefresh).keyup(myKeyRefresh)
und wir brauchen, um neu zu laden die jqGrid-container basierend auf Benutzer Entscheidungen.
Nach zu Lesen und zu analysieren, die Informationen von zusätzlichen Benutzereingaben können wir aktualisieren die jqGrid container in mindestens zwei Möglichkeiten:
- Anruf von
$.ajax()
Bedienungsanleitung und dann darin Erfolg oder komplette Griff$.ajax
nennenjQuery.parseJSON()
(odereval
) und rufen Sie dann addJSONData Funktion von jqGrid. Ich fand eine Menge von Beispielen auf stackoverflow.com die Verwendung addJSONData. - Update url von jqGrid basierend auf Benutzer-input, reset aktuelle Seite Zahl 1 ein, und ändern Sie Optional die Beschriftung des Rasters. All diese kann getan werden, mit Bezug auf setGridParam(), und Optional setCaption() jqGrid Methoden. Am Ende rufen Sie das raster trigger('reloadGrid') Funktion. Konstruieren Sie die url, übrigens verwende ich meistens jQuery.param-Funktion, um sicher zu sein, dass ich alle url-Parameter ordnungsgemäß verpackt mit Bezug auf alsterrunde.
Möchte ich uns zu diskutieren, die vor-und Nachteile beider Möglichkeiten. Derzeit nutze ich die zweite Möglichkeit ist, beginne ich mit den Vorteilen dieses ein.
Kann man sagen: ich nenne die vorhandenen Web-Service, konvertieren empfangenen Daten an den jqGrid-format und call - addJSONData. Dies ist der Grund, warum ich addJSONData Methode!
OK, ich werde wählen einen anderen Weg. jqGrid können einen Anruf tätigen, auf die Web-Service-direkt und füllen Sie die Ergebnisse innerhalb des Gitters. Es gibt eine Menge von jqGrid Optionen, die es Ihnen ermöglichen, diesen Prozess anzupassen.
Zuerst von allen, kann man löschen oder umbenennen, die keine standard-parameter an den server gesendet, mit Bezug auf die prmNames Möglichkeit, jqGrid oder fügen Sie mehrere zusätzliche Parameter mit Bezug auf die postData option (siehe http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options). Kann man ändern, alle gebaut Parameter unmittelbar vor jqGrid macht die entsprechenden $.ajax
Anfrage durch die Definition der serializeGridData() Funktion (eine weitere Möglichkeit, jqGrid). Mehr als das kann man ändern, jede $.ajax
parameter, indem Sie den ajaxGridOptions Möglichkeit, jqGrid. Ich benutze ajaxGridOptions: {contentType: "application/json"}
zum Beispiel als eine Allgemeine Einstellung des $.jgrid.defaults
.
Die ajaxGridOptions option ist sehr mächtig. Mit Bezug auf die ajaxGridOptions option kann man neu definieren, jeden parameter $.ajax
Anforderung von jqGrid, wie Fehler, komplette und beforeSend Veranstaltungen. Ich sehe potentiell interessant zu definieren dataFilter Veranstaltung in der Lage sein, änderungen in der Zeile der Daten, die vom server zurückgegeben.
Einen weiteren Grund für die Verwendung der trigger('reloadGrid') Weg ist die Blockierung von jqGrid während der AJAX-Anfrage verarbeiten. Meistens verwende ich den parameter loadui: 'block'
zu blockieren, jqGrid während der JSON-Anfrage an den server senden. Mit Bezug auf jQuery blockUI plugin http://malsup.com/jquery/block/ kann man blockieren, mehr Teile der web-Seite als nur das raster. Dazu kann man nennen:
jQuery('#main').block({ message: '<h1>Die Daten werden vom Server geladen...</h1>' });
vor dem Aufruf der trigger('reloadGrid') Methode und jQuery('#main').unblock() innerhalb der loadComplete und loadError Funktionen. Die loadui option gesetzt werden konnte, um 'deaktivieren' in diesem Fall.
Und meine Letzte Bemerkung: ich habe Meistens verwendet, um zu erstellen, jqGrid mit der Datentyp auf 'local' statt 'json', und ich würde rufen Sie die trigger('change') Funktion einiger Steuerelemente (eine comboboxes) wie:
jQuery("#selector").change(myRefresh).keyup(myKeyRefresh).trigger('change')
.
So Baue ich die url parameter von jqGrid nur an einer Stelle im inneren der änderung handle, und ändern Sie Datentyp zu 'json' innerhalb der oben beschriebenen setGridParam().
Also ich sehe nicht, warum die Funktion addJSONData() sollte nie verwendet werden.
Kann jemand, der verwendet addJSONData () - Funktion erklären Sie mir die Vorteile Ihrer Verwendung?
Fair zu sein, ich kann hinzufügen, dass addJSONData (), die es in älteren Versionen von jqGrid so dass die meisten der features, die ich hier beschreibe. Sollte man ersetzen, die Verwendung von addJSONData von jqGrid die Verwendung von setGridParam(), und trigger('reloadGrid')?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich mit addJSONData mit jqgrid, aber es war vor 1 Jahr, eine Menge Dinge geändert haben, seit dieser Zeit in jqGrid.
Jedenfalls brauchte ich heavy & komplexe gui-manipulation auf der client-Seite (bank-Aktie Dinge), meine Json Daten nur lokal und an den server gesendet, da einige jkey Punkt (job beendet). Ich hatte mehrere jqgrid (einige von Ihnen werden in andere jqgrids 🙂 ) und eine Art von lokalen browser Speicherung von Daten, die klein genug für einen Aufenthalt im browser und Komplex und bewegt genug, um Sie unbrauchbar in einer reasonnable bin mal über ajax IO.
Ersten version wurden mit Hilfe von Ajax-IO, wenn ich schon betroffen von den sperren und warten, Probleme und der Menge von neuen komplexen GUI-Dingen, die ich wirklich sehr glücklich, diese zu finden addJSONData Haken und habe meine eigene ajax-timeline außerhalb von jQgrid.
Leichtigkeit des Gebäudes von Netz - /Daten vom server. Einer der Hauptgründe, warum ich die JSON verwenden, ist, dass Ihr kleiner dann, XML, und funktioniert gut auf dem server (PHP) und client (JS) Seite. Und als Ergebnis habe ich standardisierte (und ich kenne einige tun) Datenübertragung zwischen JSON.
Daher addJSONData eine einfache Möglichkeit bietet, sich ständig zu aktualisieren alle Daten in der Tabelle, und zeigen Sie Sie in einem Schuss. Sein schnelles, schnell, dreckig, und es funktioniert.
Jedoch persönlich, dies wird die Wahlbeteiligung eine schlechte Idee ist, auf lange Sicht, mit großen datagrid ständig erfrischend. Und das ist, wo, updates für bestimmte Zelle /Spalten, nach dem ersten zu bekommen, ist eine viel bessere Idee zu haben-2 Anrufe. Submit grid ändern Sie auf server, und von änderungen vom server.
Also einer der wichtigsten Vorteile, dies zu tun, ist, dass Ihr einen schnellen start. Und wenn die Daten zu groß erhält, die option alle hinzufügen downgrades nur einmal vorkommen an den start. Während einzelne update /bekommt kann Hinzugefügt werden, nachdem die ersten Daten greifen.
Seine gute Arbeit Zyklus : Schnelle Prototypen -> Effektive client-server-datagrid -
ajaxGridOptions
undserializeGridData
Optionen, aber es war viele alte Beispiele aus der Zeit der alten Versionen, die beim senden von JSON-codierte Daten an den server war nicht direkt unterstützt. Ich schrieb also die Frage zu helfen, anderen die Benutzung der neuen (zu der Zeit) Funktionen. Wenn Sie nun verwendenaddJSONData
Sie in der Regel ignorieren Sortierung, Paginierung und Filterung. Versuchen Sie, klicken Sie auf die Spaltenüberschrift in Ihrer "Urform". Wenn Sie Ihre post-code-Beispiel möchte ich zeigen, wie es zu ändern. Es wird einfach bleibenIch bin mit addJSONData für die Verbesserung der performance auf der Seite. Hier ist mein use-case -
Ich habe 4 jqGrids auf der Seite. Die Daten-retrieval-Methode ist die gleiche für alle 4 Netze aber sind die Spalten und Zeilen unterschiedlich in jedem grid. Also anstatt 4 server ruft zum Auffüllen der Daten in jedes raster, ich einen Anruf machen, das gibt zusätzliche JSON-Daten für die anderen 3 Netze. Und auf "loadComplete" - Ereignis des ersten grid, ich trenne die Daten für jede der anderen 3 Netze und laden Sie Sie einzeln. Hier ist eine abgespeckte version des loadComplete Ereignis der ersten grid -
Dieser arbeitet schon sehr gut für die letzten 2 Wochen bis heute habe ich bemerkt, dass beim laden der Seite jedes der 3 Netze machen server anrufen, um eine zufällige URL. Der Grund dafür stellte sich heraus, zu werden, weil der Datentyp für diese Netze wurden definiert als 'json'. Wenn ich den Datentyp auf 'local', keine server-Aufrufe sind aus diesem raster aber addJSONData Methode im obigen code nicht mehr funktioniert. Ich habe versucht, mit "setGridParam" ändern Sie den Datentyp auf 'json', bevor mit addJSONData wie unten, dies ist aber auch nicht funktioniert.
Ich hoffe es gibt eine einfache Möglichkeit, konvertieren Sie die Daten in ein array und verwenden Sie addRowData 🙂
Lassen Sie mich wissen, wenn es eine bessere Art und Weise zu handhaben wie ein use-case -
loadComplete
). Auch die Sortierung der Daten in das erste raster Folgen, um wieder alle anderen Netze. Der Fall, den Sie beschreiben, "Die Daten-retrieval-Methode ist die gleiche für alle 4 Netze" scheint mir relativ exotische. Darüber hinaus ist es unklar, ob Sieloadonce: true
option in einigen der Gitter-oder nicht, wie Sie implementiert die separate paging, Sortierung oder Filterung alle Netze.Hier ist, warum ich verwenden addJSONData()...
In meinem Fall, ich habe eine Seite, die die Daten enthält, die Gitter, und eine andere Seite, die verwendet wird, zu erstellen Suchkriterien.
Die Seite suchen, die weiß nichts über die grid-Seite, enthält sieben Felder. Die Benutzer können füllen Sie mindestens eines oder alle sieben Felder.
Beim senden der Seite suchen-Formate die Daten werden als Schlüssel/Wert-Paare in ein JSON-Objekt an den server gesendet wird.
Auf dem server die JSON-Daten untersucht und in einer SQL-WHERE-Klausel.
Die SQL-Daten-Ergebnisse werden zurück an den client gesendet als JSON-Objekt in der HTTP-Antwort, die baut auch die grid-Seite aus dem code vom server gesendet.
Soweit ich weiß, ist der einzige Weg, um die JSON-Daten aus der HTTP-response in das Netz ist mit addJSONData().
Chris
addJSONData
ist nicht der einzige Weg, um JSON-Daten vom server. Sie können definierendatatype:"json"
parameter von jqGrid und jqGrid für Sie senden die Anfrage an den server, wenn Sie die Daten benötigen (im Falle der Seite Umschalten, ändern der Sortierreihenfolge und der für die erste Befüllung, von der Ursache). Manchmal (abhängig von der server-software), benötigen SieajaxGridOptions
um zusätzliche ajax-Parameter. Was Sie tun, ist diskutiert in stackoverflow.com/questions/2928371/....addJSONData
Wenn Sie brauchen, um die vollständige Kontrolle darüber, wie und Wann die ajax senden, Sie bevorzugen die Verwendung
addJSONData
.z.B. Ein Suchformular enthält zwei
<select>
box, beide ajaxly gefüllt, der Wert der erstenselect
auf die zweite. Es ist möglich, dass Benutzer festgelegten Standardwert für dieselect
Boxen. Und Sie wollen die Suche nur das raster nach dem Sie die beiden Werte definiert sind.Dann ist es mehr bevorzugt, Dinge wie
$.Deferred
zur Steuerung der Reihenfolge von ajax-calls gemacht werden, und Auffüllen. Natürlich können Sie festlegen, jqgrid Daten alslocal
dannjson
, und dannreloadGrid
zur Kontrolle der Auslösung. Aber das ist nicht so trival.addJSONData
können nicht helfen, im Falle der Umsetzung des abhängigen wählt.<select>
s sind nicht in der Startaufstellung. Sie sind externe Komponenten, die will, um die Interaktion mit dem Netz.addJSONData
. Wenn Sie eine externe Kontrollen wie<select>
und Sie möchten, filtern Sie die raster-Daten auf der server-Seite basierend auf der Auswahl von<select>
können SiepostData
als Funktionen. Siehe die Antwort für weitere details. Ist es das, was Sie tun?<select> A
und füllen Sie in Standard-Wert --> ajaxly laden<select> B (which depend on A)
und füllen default-Wert ==> laden jqgrid Daten. Diese ajax-Aufrufe zu geschossen werden, die in bestimmten Reihenfolge.Ich die addJSONData Methode für paging-Zwecke, wie unten erklärt.
Auf die Seite laden, das jqgrid ist geladen mit der JSON-Daten zurückgegeben, die durch die URL.
Wir müssen die nächste Seite funktioniert, aber die zimmerreserviereung, ohne das Umschalten der Seiten.
ich.e Zunächst die Seite 1 geladen wird, mit sagen wir 10 Einträge. Wenn ich auf die Schaltfläche Weiter (NavButton), statt beim laden der nächsten 10 Datensätze auf der nächsten Seite möchte ich Sie alle 20 Aufzeichnungen werden auf der Seite angezeigt 1 selbst.
Hier auf die zweite und nachfolgende Anfragen, ich bin mit addJSONData Methode. Ich mache ajax-Aufruf über Klick auf die Schaltfläche Weiter und verwenden Sie dann addJSONData zu fügen Sie die json-Daten zu den bestehenden 10 Datensätze.
Ich kann die setGridParam wenn ich denn verwenden, dass die ersten 10 Datensätze verschwunden sind und es nur lädt die nächsten 10 Einträge auf der gleichen Seite.
Wenn Sie irgendwelche alternativen für addJSONData für diese Besondere Funktionalität, werde ich glücklich sein zu wissen. Als ich Probleme mit Subgrid-Erweiterung, Symbolleiste Filter usw, wenn die nächste Gruppe von Datensätzen ist geladen mit addJSONData.