2010-12-20 19 views
8

La primera página de resultados con un jqgrid rowObject devuelve los datos esperados pero luego devuelve datos incompletos para páginas posteriores de resultados. ¿Por qué?jqGrid - rowObject incoherencias?

primera página de resultados: rowObject [3] será igual a "2"

páginas siguientes de los resultados: rowObject [3] será igual a "indefinido" y volver a la primera página de resultados también ahora igual "indefinido".

Información adicional y algo de código:

Con jqGrid, si se desea implementar un formateador personalizado que utiliza un parámetro llamado rowObject que contiene los datos de la fila. Así, por ejemplo, una fila de rowObject podría ser algo como:

["18", "133", "Betelguese", "3", "photo.jpg", "", "0", ""] 

Así que mi formateador personalizado utiliza algunos de estos datos para preparar un enlace de la siguiente manera:

var newval = '<a href="/proj/' + rowObject[3] + '/images/' + imgval + '">' + imgval + '</a>'; 

y esto me da una URL como :

<a href="/proj/3/images/photo.jpg">photo.jpg</a> 

Hasta ahora todo bien. Mi problema es que cuando voy a la siguiente página de resultados en la jqGrid pierdo algunos de estos datos y sale:

<a href="/proj/undefined/images/photo.jpg">photo.jpg</a> 

Si se me carga la página con todos los resultados que se muestra todo funciona bien, sin embargo si use paginación, solo la primera página de resultados tendrá el valor correcto para rowObject [3], mientras que cualquier otro resultado en páginas subsiguientes no tendrá ese valor de rowObject.

¿Por qué rowObject contiene los datos correctos en lo que se carga inicialmente en la cuadrícula y parece perder esos datos cuando aparece la página siguiente de los resultados de la cuadrícula?

Una cosa que estoy viendo en Firebug que no entiendo ... cuando la página inicialmente cargas consigo:

console.log(rowObject); 
["18", "133", "Betelguese", "3", "photo.jpg", "", "0", ""] 

En la siguiente página de resultados, cuando las cosas dejan de funcionar como espero , Veo

console.log(rowObject); 
Object { photo_id="18", site_id="133", more...} 

¿Por qué el cambio? El primer resultado es json, entonces, ¿por qué ahora obtengo este objeto?

Respuesta

10

Supongo que usa la opción loadonce:true. Es uno de la opción que trae muchos problemas (principalmente problemas de comprensión). La separación entre datos locales y remotos quedó clara antes de la introducción en la versión 3.7 de jqGrid de las nuevas funciones de clasificación, búsqueda y filtrado (búsqueda) local. Comenzando con la versión 3.7 de jqGrid, la opción loadonce:true le permite tener una mezcla entre los datos remotos que tiene en la primera carga y los datos locales que tiene más adelante. En another answer el problema de cerca ya fue discutido. Al final del proceso de carga en el caso del uso de la opción loadonce:true, el datatype de jqGrid se cambiará a 'local'. Después de eso, muchas cosas funcionan de manera diferente.

que sugerimos utilizar jQuery.isArray(rowObject) como una forma rápida y efectiva para determinar si debe acceder por rowObjectrowObject[3] índice entero (si tiene acceso a datos remotos) o por propiedad llamado rowObject.projectId.

Puede ver toda la información local con $("#list").jqGrid('getGridParam','data'), que devuelve la matriz de todos los locales rowObject.

Si los datos que necesita acceder (rowObject[3]) no se guardan en el jqGrid en alguna columna, entonces no será capaz de ver la información en el rowObject. En el caso, puede utilizar una columna oculta adicional para los datos o guardar los datos en la primera carga dentro de loadComplete: function(data) { ... } en cualquier objeto externo . Puede probar que $("#list").jqGrid('getGridParam','datatype') es 'json' (o 'xml' depende de los datos de su servidor) y si es verdadero, puede guardar todos los datos devueltos del servidor que necesite (desde la 3ª columna de la matriz data) en una matriz externa de objeto. Entonces podrá acceder a los datos más tarde dentro de su formateador personalizado.

ACTUALIZADO: El problema se resuelve en free jqGrid tenedor de jqGrid. El formateador personalizado (y cellattr, rowattr) contiene todavía rowObject parámetro por razones de compatibilidad, pero hay existir adicionalesrowData propiedades donde los datos analizados se guardan como propiedades con nombre:

formatter: function (cellValue, options, rowObject) { 
    // either rowObject[1] or rowObject.site_id, 
    // but options.rowData.site_id works ALWAYS 
} 

Uno puede utilizar

cellattr: function (rowid, cellValue, rowObject, cm, item) { 
    // either rowObject[1] or rowObject.site_id, 
    // but item.site_id works ALWAYS 
} 

en cellattr.

+1

Muy útil ... ¡¡¡Gracias !!! –

+2

@AshishJain: ¡De nada! Me alegra que la respuesta, que tiene más de 3 años, todavía sea real y pueda ayudar. – Oleg

+1

@Oleg Tengo el mismo problema. No importa si defino loadonce: verdadero o no. Tan pronto como procedo a la segunda página, los identificadores quedan indefinidos. Cuando accedo a $ ("# list"). JqGrid ('getGridParam', 'data') ya no tengo ninguna identificación (incluidas las de la primera página). Mi pregunta es: funciona cuando defino un objeto externo, tal como sugirió (y le agradezco la solución), pero ¿no es una 'solución alternativa'? –