jqGrid - rowObject Inkonsistenzen?

8

Die erste Seite der Ergebnisse mit einem jqgrid-rowObject gibt erwartete Daten zurück, gibt dann jedoch unvollständige Daten für nachfolgende Ergebnisseiten zurück. Warum?

Erste Seite der Ergebnisse: rowObject [3] ist gleich "2"

Nachfolgende Seiten der Ergebnisse:  rowObject [3] ist gleich "undefiniert" und die Rückkehr zur ersten Seite der Ergebnisse ist nun gleich "undefiniert".

Weitere Details und Code:

Wenn Sie mit jqGrid einen benutzerdefinierten Formatierer implementieren möchten, verwenden Sie einen Parameter namens rowObject, der die Zeilendaten enthält. Eine Zeile von rowObject könnte beispielsweise so aussehen:

%Vor%

So verwendet mein benutzerdefinierter Formatierer einige dieser Daten, um einen Link wie folgt vorzubereiten:

%Vor%

und das gibt mir eine URL wie:

%Vor%

So weit, so gut. Mein Problem ist, dass wenn ich auf die nächste Seite der Ergebnisse in der jqgrid gehe ich einige dieser Daten verlieren und erhalten:

%Vor%

Wenn ich die Seite mit allen angezeigten Ergebnissen lade, funktioniert alles gut, aber wenn ich Paging verwende, wird nur die erste Seite der Ergebnisse den korrekten Wert für rowObject [3] haben, während jedes andere Ergebnis auf nachfolgenden Seiten nicht haben wird dieser RowObject-Wert!

Warum enthält rowObject die richtigen Daten darüber, was ursprünglich in das Raster geladen wurde, und scheinbar die Daten verloren gehen, wenn die nächste Seite der Rasterergebnisse angezeigt wird?

Eine Sache, die ich in Firebug sehe, die ich nicht verstehe ... Wenn die Seite anfänglich geladen wird, bekomme ich:

%Vor%

Auf der nächsten Seite der Ergebnisse, wo die Dinge nicht mehr funktionieren, wie ich es erwarte, sehe ich

%Vor%

Warum die Änderung? Das erste Ergebnis ist JSON. Warum bekomme ich jetzt dieses Objekt?

    
Lothar 20.12.2010, 00:28
quelle

1 Antwort

10

Ich nehme an, dass Sie die Option loadonce:true verwenden. Es ist eine der Optionen, die viele Probleme (meist Verständnis von Problemen) bringen. Die Trennung zwischen lokalen und entfernten Daten war klar, bevor in der Version 3.7 von jqGrid die neuen lokalen Sortier-, Paging- und Filter- (Such-) Funktionen eingeführt wurden. Ab jqGrid Version 3.7 ermöglicht Ihnen die Option loadonce:true eine Mischung zwischen den entfernten Daten, die Sie beim ersten Laden haben, und den lokalen Daten, die Sie später haben. In eine weitere Antwort wurde das Problem bereits besprochen. Am Ende des Ladeprozesses wird bei% loadonce:true die datatype von jqGrid in 'local' geändert. Danach funktionieren viele Dinge anders.

Ich empfehle Ihnen, jQuery.isArray (rowObject) als schnelle und effektive Methode zu verwenden, um zu bestimmen, ob Sie dies tun sollten Zugriff rowObject pro ganzzahligen Index rowObject[3] (wenn Sie auf ferne Daten zugreifen) oder pro benannte Eigenschaft rowObject.projectId .

Sie können die gesamten lokalen Daten mit $("#list").jqGrid('getGridParam','data') sehen, was das Array aller lokalen rowObject zurückgibt.

Wenn die Daten, auf die Sie zugreifen müssen ( rowObject[3] ) nicht in im jqGrid in einer Spalte gespeichert sind, können Sie die Informationen in rowObject nicht sehen. In diesem Fall können Sie eine zusätzliche versteckte Spalte für die Daten verwenden oder die Daten beim ersten Laden innerhalb von loadComplete: function(data) { ... } in einem externen Objekt speichern. Sie können testen, ob $("#list").jqGrid('getGridParam','datatype') ist 'json' (oder 'xml' hängt von Ihren Serverdaten ab) und wenn es wahr ist, können Sie alle Daten vom Server, die Sie benötigen, speichern (aus der 3. Spalte von data array) in einem externen Array von Objekten. So können Sie später auf die Daten in Ihrem benutzerdefinierten Formatierer zugreifen.

AKTUALISIERT : Das Problem ist in free jqGrid fork von jqGrid gelöst. Der benutzerdefinierte Formatierer (und cellattr , rowattr ) enthält aus Kompatibilitätsgründen noch den Parameter rowObject , aber es gibt zusätzliche rowData -Eigenschaften, in denen die analysierten Daten als benannte Eigenschaften gespeichert werden:

%Vor%

Man kann

verwenden %Vor%

in cellattr .

    
Oleg 20.12.2010, 01:08
quelle

Tags und Links