2010-12-04 10 views
5

¿Hay alguna forma de pasar parámetros al archivo de script .nocache.js generado por GWT y evaluarlos en la función onModuleLoad? De este modo:Pase el parámetro al script bootstrap GWT .nocache.js script

<script type="text/javascript" src="application/Application.nocache.js?appId=461333815262909"></script> 

La URL de la página de acogida debe estar completamente separada de la materia GWT trabajar en el interior, por lo que pasa el parámetro Id de aplicación como parámetro de consulta de la página de acogida y para acceder a él con Window.Location.getParameter no es una opción. Sé que podría ocultar esos parámetros, p. en DIV ocultos y luego consultarlos desde el script, pero si es posible, me encantaría evitar cualquier dependencia adicional en la página de host.

Gracias! Lisa

Respuesta

2

No, pero this article puede ser útil para pasar parámetros del servidor a la secuencia de comandos del lado del cliente para su evaluación en la carga de la página.

2

No parece haber ningún soporte nativo en GWT para eso, pero yo le ocurrió la siguiente solución ultimamente:

Suponiendo que la secuencia de comandos siempre sigue la convención de nomenclatura "/<moduleName>.nocache.js", se puede recuperar todos los <script> elementos de la página de host y busque la que hace referencia a esto en el atributo src. A continuación, puede extraer los atributos codificados por URL desde allí.

Aquí está mi implementación de ejemplo, destinada a ser llamada con GWT.getModuleName() como primer parámetro.

/** 
* Fetches a parameter passed to the module's nocache script. 
* 
* @param moduleName the module's name. 
* @param parameterName the name of the parameter to fetch. 
* @return the value of the parameter, or <code>null</code> if it was not 
* found. 
*/ 
public static native String getParameter(String moduleName, String parameterName) /*-{ 
    var search = "/" + moduleName + ".nocache.js"; 
    var scripts = $doc.getElementsByTagName("script"); 
    for(var i = 0; i < scripts.length; ++i) { 
     if(scripts[ i ].src != null && scripts[ i ].src.indexOf(search) != -1) { 
      var parameters = scripts[ i ].src.match(/\w+=\w+/g); 
      for(var j = 0; j < parameters.length; ++j) { 
       var keyvalue = parameters[ j ].split("="); 
       if(keyvalue.length == 2 && keyvalue[ 0 ] == parameterName) { 
        return unescape(keyvalue[ 1 ]); 
       } 
      } 
     } 
    } 
    return null; 
}-*/; 

Sugerencias para mejorar son bienvenidas.

3

En lugar de ocultar información en divs ocultos que podrían desordenarse, una forma fácil de pasar argumentos es a través de las metaetiquetas HTML.

En la página HTML que llama al script GWT, añadir una etiqueta meta de la siguiente manera:

<html> 
    <head> 
    <meta name="appId" content="461333815262909"> 
    ... 

A continuación, en el punto de entrada del módulo, análisis sintáctico de la siguiente manera:

@Override 
public void onModuleLoad() { 
    NodeList<Element> metas = Document.get().getElementsByTagName("meta"); 
    for (int i=0; i<metas.getLength(); i++) { 
     MetaElement meta = (MetaElement) metas.getItem(i); 
     if ("appId".equals(meta.getName())) { 
      Window.alert("Module loaded with appId: " + meta.getContent()); 
     } 
    } 
} 

Por supuesto, no es tan simple como pasar el argumento en src URL de la etiqueta del script, pero creo que es un poco más limpio que ocultar divs en el contenido del documento y menos propenso a errores que volver a analizar artificialmente el atributo fuente del script script.

Cuestiones relacionadas