2011-11-15 4 views
1

J'ai un problème étrange avec la liaison différée. J'ai défini le module suivant:La liaison différée ne fonctionne pas après la compilation

<?xml version="1.0" encoding="UTF-8"?> 

<!-- Defines the usercategory property and its provider function. --> 
<module> 

    <define-property name="usercategory" values="c00,c01,c02" /> 
    <collapse-property name="usercategory" values="*" /> 

    <property-provider name="usercategory"><![CDATA[ 
     // Look for the usercategory cookie 
     var cs = document.cookie.split(';'); 
     for (var i = 0; i < cs.length; i++) { 
      var name = cs[i].substr(0, cs[i].indexOf("=")); 
      var value = cs[i].substr(cs[i].indexOf("=") + 1); 
      name = name.replace(/^\s+|\s+$/g,""); 
      if (name == "usercategory") { 
       return unescape(value); 
      } 
     } 

     return "c00"; 
    ]]></property-provider> 

</module> 

qui définit la propriété usercategory en regardant la valeur d'un cookie nommé usercategory.

J'utilise cette propriété application.gwt.xml de reporter la liaison de certaines classes, par exemple:

<inherits name="com.example.UserCategory"/> 

<replace-with class="com.example.client.ui.menu.MainMenuView01"> 
    <when-type-is class="com.example.client.ui.menu.MainMenuView"/> 
    <when-property-is name="usercategory" value="c01"/> 
</replace-with> 

Cela fonctionne comme un charme quand je suis en mode développement (c.-à lors de l'exécution de mon application à l'intérieur Éclipse). Cependant, si je compile l'application et la déploie (dans Jetty, mais ce n'est pas le cas), la liaison différée ne semble pas fonctionner et les classes attendues ne sont pas chargées. J'ai vérifié et le cookie est configuré correctement avec la valeur correcte c01, mais la classe com.example.client.ui.menu.MainMenuView01 n'est pas chargée.

Ai-je raté quelque chose? Est-ce que je fais quelque chose de mal?

Merci d'avance!

+0

Avez-vous essayé de placer des instructions de débogage dans le fournisseur de propriétés pour voir ce qui se passe? Comme 'console.log' pour afficher certaines valeurs analysées? – Strelok

+0

J'ai essayé ça. Le message sur 'console.log' sort comme prévu, mais l'application ne se comporte pas comme prévu: le' com.example.client.ui.menu.MainMenuView01' n'est pas chargé. Cependant, j'ai remarqué que si je clique sur le bouton de rechargement du navigateur, alors tout fonctionne bien ... Je ne sais pas pourquoi.De toute façon, je ne peux pas demander à mon utilisateur de cliquer sur recharger :( – MarcoS

Répondre

0

je me suis dit quel était le problème, et je l'écris ici au cas où d'autres pourraient être intéressés.

Le module que j'ai défini (voir code dans ma question) définit une propriété dont la valeur est extraite d'un cookie généré après que l'utilisateur se soit connecté à l'application.

À l'origine j'avais un GWT Place pour la connexion, et quand l'utilisateur authentifié avec succès l'application déplacée à un autre endroit. Dans ce cas, lorsque l'utilisateur entre dans l'application et que le Javascript GWT est téléchargé dans le navigateur, le cookie n'est pas encore défini (parce que l'utilisateur n'a pas encore effectué de connexion). Par conséquent, la liaison différée ne fonctionne pas et les classes attendues (comme com.example.client.ui.menu.MainMenuView01) ne sont pas chargées.

Je ne sais pas pourquoi cela fonctionne correctement en mode développement. En tous cas. la solution que j'ai implémentée consiste à déplacer la phase de connexion en dehors de l'application GWT, et lorsque la connexion est réussie, j'ajoute le cookie et redirige l'utilisateur vers l'application GWT réelle.

0

Il y a deux possibilités. Vous faites quelque chose de mal, ou il y a un autre bug dans le compilateur GWT. J'ai essayé d'implémenter un cas comme le vôtre et ça fonctionnait quand il était compilé sans aucun problème. Donc, très probablement, il peut y avoir une erreur de votre côté. Donc, ce que je recommande de faire est de compiler l'application avec-style PRETTY et voir comment il a été compilé. trouver la fonction nommée com_example_client_ui_menu_MainMenuView(), et voir si elle est capable de créer MainMenuView01, essayer de le déboguer et etc. Quoi qu'il en soit, ce genre de choses devrait fonctionner sans aucun problème.

Essayez aussi de déboguer votre fournisseur de propriété (et l'utilisation vars $ doc et $ WND dans fournisseur de propriété au lieu de la fenêtre)

Un autre cas possible est que le cookie peut-être pas lisible de JS

+0

J'ai peut-être fait quelque chose de mal, mais pourquoi ce même code fonctionne-t-il correctement en mode développement? – MarcoS

+0

Puisque je n'ai pas votre code, je ne peux pas Il y a beaucoup de possibilités, de GWT.isScript() à la différence entre les données retournées en production et l'environnement local (par exemple le flux de l'application peut être différent à cause de certains paramètres de production donc le GWT.create pour la permutation douce n'est pas Un peu de compilateur est également possible (j'ai rencontré quelques cas où le compilateur GWT a supprimé du code utile). Essayez de déboguer l'application compilée pour voir si le problème est vraiment lié à la liaison différée – jusio

+0

J'essaye de déboguer J'ai remarqué que si je clique sur le bouton de rechargement du navigateur, alors tout fonctionne bien ... Je ne sais pas pourquoi, de toute façon, je ne peux pas demander à mon utilisateur de cliquer sur recharger – MarcoS

Questions connexes