2010-10-07 4 views
6

J'essaie de démarrer avec SmartGwt. J'utilise XJSONDatasource pour effectuer un appel interdomaines sur une page d'exemple de SmartClient contenant des données JSON. Quand je lance le code, cependant, une fenêtre surgit qui dit "Trouver des enregistrements qui correspondent à vos critères ..." Cela ne disparaît jamais, et les données ne sont pas chargées. J'utilise la version gratuite de SmartGwt (ma société a dit que c'est ce que nous utiliserons). En espérant que je manque quelque chose d'évident.SmartGwt - Charger les données de la grille à partir 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

Vous devriez marquer cette question avec X-JSON et – anataliocs

Répondre

4

Je vois des docs ici: http://www.smartclient.com/smartgwt/javadoc/com/smartgwt/client/data/XJSONDataSource.html

Note, comme il est indiqué dans le tutoriel ci-dessus, le serveur est responsable de écrivant non seulement les données, mais également une fonction JavaScript appelez cela indique le client que la réponse a est arrivé. Le client passe le nom de la fonction à appeler en tant que "URL de rappel" paramètre d'URL.

Mais il n'y a pas de rappel dans le code à la page que vous liez à www.smartclient.com/smartgwt/showcase/data/dataIntegration/json/contactsData.js

3

Lorsque votre source de données SmartGWT fait une appel à l'adresse suivante:

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

(Si vous source de données fait appel à une application Java aller au fond de cette réponse)

la demande de votre source de données fera comprendra un paramètre GET appelé rappel qui ressemble à ceci:

callback=isc.Comm._scriptIncludeReply_0 

Le script, contactsData.js, devra saisir ce paramètre GET.

contactsData.js devront inclure une bibliothèque pour récupérer les paramètres de l'URL:

javascript récupérer la fonction de paramètres:

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 récupérer des paramètres de fonction

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

Une fois que vous obtenez la valeur du paramètre de rappel vous écrirez le nom de la fonction avec le JSON en tant que paramètre dans le corps de la réponse comme suit:

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

Ainsi, le code javascript ressemblera à quelque chose comme ceci:

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

JAVA

Si votre source de données SmartGWT fait un appel à une URL d'application Java:

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

Votre contrôleur Java fera la même chose mais il est mu ch plus facile

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

Questions connexes