2010-10-07 13 views
6

Estoy tratando de comenzar con SmartGwt. Estoy usando XJSONDatasource para hacer una llamada entre dominios a una página de ejemplo en SmartClient que tiene datos JSON. Sin embargo, cuando ejecuto el código aparece una ventana emergente que dice "Encontrar registros que coincidan con sus criterios ...". Esto nunca desaparece y los datos no se cargan. Estoy usando la versión gratuita de SmartGwt (mi compañía ha dicho que esto es lo que usaremos). Esperando que me esté perdiendo algo obvio.SmartGwt - Cargar datos de cuadrícula de JSON

DataSource dataSource = new XJSONDataSource(); 
    dataSource.setDataTransport(RPCTransport.SCRIPTINCLUDE); 
    dataSource.setDataFormat(DSDataFormat.JSON); 

    dataSource.setDataURL("http://www.smartclient.com/smartgwt/showcase/data/dataIntegration/json/contactsData.js"); 
    DataSourceTextField nameField = new DataSourceTextField("name", "name"); 

    nameField.setValueXPath("name"); 

    dataSource.setFields(nameField); 

    ListGrid grid = new ListGrid(); 
    grid.setDataSource(dataSource); 
    grid.setWidth100(); 
    grid.setHeight(100); 
    grid.setAutoFetchData(true); 
    grid.draw(); 
+0

Usted debe etiquetar a esta pregunta con X-JSON, así – anataliocs

Respuesta

4

que veo de los documentos aquí: http://www.smartclient.com/smartgwt/javadoc/com/smartgwt/client/data/XJSONDataSource.html

Tenga en cuenta, como se indica en el tutorial anterior, el servidor es responsable de escribir no sólo los datos, pero también una función de JavaScript llame al le dice al cliente que la respuesta ha llegado . El cliente pasa el nombre de la función para llamar como el parámetro URL de "devolución de llamada" .

Pero no hay tal devolución de llamada en el código en la página que vincula al www.smartclient.com/smartgwt/showcase/data/dataIntegration/json/contactsData.js

3

Cuando su fuente de datos SmartGWT hace una llamar a esta URL:

http://www.smartclient.com/smartgwt/showcase/data/dataIntegration/json/contactsData.js 

(Si la fuente de datos le está haciendo una llamada a una aplicación Java ir a la parte inferior de esta respuesta)

la solicitud de su fuente de datos hará que incluirá un parámetro GET llama devolución de llamada que se ve así:

callback=isc.Comm._scriptIncludeReply_0 

La secuencia de comandos, contactsData.js, tendrá que capturar este parámetro GET.

contactsData.js tendrán que incluir una biblioteca para recuperar los parámetros de la URL:

Javascript a recuperar los parámetros de la función:

function getParameter (queryString, parameterName) { 
    // Add "=" to the parameter name (i.e. parameterName=value) 
    var parameterName = parameterName + "="; 
    if (queryString.length > 0) { 
     // Find the beginning of the string 
     begin = queryString.indexOf (parameterName); 
     // If the parameter name is not found, skip it, otherwise return the value 
     if (begin != -1) { 
     // Add the length (integer) to the beginning 
     begin += parameterName.length; 
     // Multiple parameters are separated by the "&" sign 
     end = queryString.indexOf ("&" , begin); 
     if (end == -1) { 
     end = queryString.length 
     } 

jQuery recuperar parámetros de la función

http://ajaxcssblog.com/jquery/url-read-request-variables/ 

Después de obtener el valor del parámetro de devolución de llamada escribirá el nombre de la función con el JSON como un parámetro en el cuerpo de la respuesta como sigue:

isc.Comm._scriptIncludeReply_0({"item": [ {"id": "1","name": "Monkey"}, 
{"id": "2","name": "Tree"}, 
{"id": "3","name": "Banana"} ] }) 

Así que el código JavaScript se verá algo como esto:

Response.Write(getParameter(URLrequestFromDatasourceString,"callback") + " (" + JSON + ")"); 

JAVA

Si su fuente de datos SmartGWT hace una llamada a una URL de la aplicación Java:

http://www.smartclient.com/getJson.htm

Su controlador Java hará lo mismo pero es mu ch fácil

String callbackString = request.getParameter("callback"); 

response.setContentType("text/X-JSON"); 
response.getWriter().write(callbackString + " (" + JSONstring + ") "); 
response.setStatus(HttpServletResponse.SC_OK); 

Also, here is a link to a blog post on the issue