Identificación personalizada de JQGrid xmlreader
Frecuentes
Visto 1,384 veces
2
Necesito pasar una identificación personalizada a la estructura xmlreader para que JQGrid se alimente de una combinación de nodos en los datos xml para identificar las filas de manera única. Actualmente tengo esta versión funcionando.
var feedXmlReaderOptions = {
root: "feed",
row: "entry",
repeatitems: false,
id: "d|clmNum,d|seqNum"
};
que concatena los nodos xml clmNum y seqNum para crear un identificador único para la fila.
Por cierto, el d| se refiere a un espacio de nombres utilizado en el xml, así que ignórelo, no es relevante para esta pregunta. El problema aquí es que necesito un delimitador entre clmNum y seqNum para poder analizar la identificación más adelante, durante el
ajaxRowOptions: {
beforeSend:...
}
event, para que pueda crear dinámicamente la URL en la que necesito publicar. La URL para publicar obviamente escucha la misma identificación que la fila de la cuadrícula, por lo que ve la conexión. Lo que probé, dado el estilo del selector CSS utilizado, fueron los pseudo elementos CSS, a través de los cuales uno puede insertar elementos personalizados, inexistentes, en el selector:
d|clmNum:after { content: "_" },d|seqNum
d|clmNum.after('_'),d|seqNum
pero no funciona... Los selectores de jQuery se quejan del {, y el jquery .after(), al igual que .before(), parece funcionar en línea como métodos, no como argumentos, después de que el selector ya devolvió un resultado.
Entonces, ¿alguien tiene una idea sobre cómo hacer esto? La alternativa de devolver la clave concatenada durante la creación del xml no funciona, el xml no está bajo mi control.
Gracias un montón. serban@nj, estados unidos
Agregado para aclaraciones: Mi XML se ve así:
<?xml version="1.0" encoding="utf-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xml:base="http://localhost:8888/eClaimWS/olddispatch.svc/">
<title type="text">DispatchManualInfo</title>
<id>http://localhost:8888/eClaimWS/olddispatch.svc/DispatchManualInfo</id>
<updated>2012-05-21T18:13:44Z</updated>
<link rel="self" title="DispatchManualInfo" href="DispatchManualInfo" />
<entry>
<id>http://localhost:8888/eClaimWS/olddispatch.svc/DispatchManualInfo(clmNum='00C1400J0025',seqNum=1)</id>
<title type="text" />
<updated>2012-05-21T18:13:44Z</updated>
<author>
<name />
</author>
<link rel="edit" title="DispatchManualInfo" href="DispatchManualInfo(clmNum='00C1400J0025',seqNum=1)" />
<category term="eClaimDispatchProdModel.DispatchManualInfo" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
<content type="application/xml">
<m:properties>
<d:busPhone />
<d:damDesc>cat</d:damDesc>
<d:vehColor />
<d:totLssInd />
<d:dispTransCtr m:type="Edm.Int32" m:null="true" />
<d:clmntCity />
<d:companyCd>01</d:companyCd>
<d:insZip>07470</d:insZip>
<d:adjZip>07701 565</d:adjZip>
<d:vehLocSt>NJ</d:vehLocSt>
<d:vehMake />
<d:lossTypeAbbr>WIND</d:lossTypeAbbr>
<d:homePhone>201-301-5411</d:homePhone>
<d:insLstNm>derti</d:insLstNm>
<d:city>wayne</d:city>
<d:adjLocalPhone>973-434-2482</d:adjLocalPhone>
<d:vehVin>UNK99999999999999</d:vehVin>
<d:adjName>Elaine Maniscalco</d:adjName>
<d:lstChgUser>Vendor</d:lstChgUser>
<d:seqNum m:type="Edm.Int32">1</d:seqNum>
<d:clmNum>00C1400J0025</d:clmNum>
</m:properties>
</content>
</entry>
......
</feed>
No puedo usar feed>entry>id para configurar el parámetro id de xmlreader, porque el nodo id es demasiado grande y causa todo tipo de problemas como ID de fila para la cuadrícula... Lo que necesito es una versión corta del nodo id, algo como 00C1400J0025_1. Dado que clmNum y seqNum también están presentes de forma independiente en el XML, quería usar xmlreader con
id: "d|clmNum:after { content: "_" },d|seqNum"
y eso no funcionó. Con
id: "d|clmNum,d|seqNum"
el ID de fila se convierte en 00C1400J00251 y tengo dificultades para analizarlo, porque clmNum puede ser cualquier cosa, de cualquier longitud.
1 Respuestas
0
Te recomendaria usar beforeProcessing
devolución de llamada para normalizar el <id>
valores de la <entry>
elementos de
<id>http://localhost:8888/eClaimWS/olddispatch.svc/DispatchManualInfo(clmNum='00C1400J0025',seqNum=1)</id>
a
<id>00C1400J0025_1</id>
Para implementar esto puedes usar RegEx
por ejemplo.
Después de eso, puede llenar fácilmente la cuadrícula con la información que necesita. Para leer información de elementos que tienen espacio de nombres u otros caracteres especiales, puede escapar del carácter con dos barras invertidas: \\
(consulte la sección del aquí información sobre el escape de metacaracteres). Por ejemplo, para leer el elemento d:adjName
puedes usar xmlmap: 'd\\:adjName'
. El enfoque funciona perfectamente en todos los navegadores con excepción de los navegadores webkit (Chrome, Safari). Como solución se puede utilizar xmlmap: 'd\\:adjName, adjName'
porque xmlmap: 'adjName'
funcionará en Chrome y Safari. Personalmente encuentro mejor el camino con el uso de getElementsByTagNameNS
.
La demo parece:
y tiene el siguiente código
$("#list").jqGrid({
url: "CustomXmlReader.xml",
colModel: [
{name: 'id'}, // optional
{name: 'updated', formatter: 'date'},
{name: 'adjName', xmlmap: function (entry) { // 'd\\:adjName, adjName'
var nodes;
if (entry.getElementsByTagNameNS) {
nodes = entry.getElementsByTagNameNS("http://schemas.microsoft.com/ado/2007/08/dataservices", "adjName");
} else {
// old IE browsers
nodes = entry.getElementsByTagName("d:adjName");
}
return nodes.length > 0 ? nodes[0].firstChild.nodeValue : "";
}}
],
gridview: true,
height: "auto",
xmlReader: {
root: "feed",
row: "entry",
repeatitems: false,
id: "id"
},
beforeProcessing: function (data) {
$(data).children("feed").children("entry").each(function () {
var id = $(this).find(">id"),
res = /\(clmNum='([0-9A-Z]+)',seqNum=(\d+)\)$/g.exec(id.text());
id.text(res[1] + "_" + res[2]);
});
}
});
contestado el 21 de mayo de 12 a las 22:05
Como siempre, Oleg, ¡increíble tenerte entre nosotros! Su respuesta es más de lo que quería porque en realidad nos enseña cómo manipular los datos provenientes de fuentes de datos que no están bajo nuestro control. Muchas muchas gracias. - nenea
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas jqgrid jquery-selectors xmlreader or haz tu propia pregunta.
Me temo que debe incluir un ejemplo de los datos XML que usa como entrada y la definición jqGrid (código JavaScript) que usa. Sin la información es muy difícil entender sus problemas. - Oleg
El XML se ve así: - nenea
Debe hacer clic en el enlace "editar" debajo de su pregunta y agregar el texto con nueva información. Aquí se describe cómo formatear el código. - Oleg
Lo siento, el comentario no permitía suficientes caracteres... mensaje inicial editado arriba con información adicional... gracias Oleg por tomarte el tiempo de ver esto. - nenea