2009-06-19 10 views
0

J'ai une application plus grande avec laquelle je travaille mais le GWT History documentation a un exemple simple qui démontre le problème. L'exemple est copiée pour des raisons pratiques:Comment reconstruisez-vous la pile GWT History?

public class HistoryTest implements EntryPoint, ValueChangeHandler 
{ 
    private Label lbl = new Label(); 

    public void onModuleLoad() 
    { 
     Hyperlink link0 = new Hyperlink("link to foo", "foo"); 
     Hyperlink link1 = new Hyperlink("link to bar", "bar"); 
     Hyperlink link2 = new Hyperlink("link to baz", "baz"); 

     String initToken = History.getToken(); 

     if (initToken.length() == 0) 
     { 
      History.newItem("baz"); 
     } 

     // Add widgets to the root panel. 
     VerticalPanel panel = new VerticalPanel(); 
     panel.add(lbl); 
     panel.add(link0); 
     panel.add(link1); 
     panel.add(link2); 
     RootPanel.get().add(panel); 

     History.addValueChangeHandler(this);  // Add history listener 
     History.fireCurrentHistoryState(); 
    } 

    @Override 
    public void onValueChange(ValueChangeEvent event) 
    { 
     lbl.setText("The current history token is: " + event.getValue()); 
    } 
} 

Le problème est que si vous actualisez l'application, la pile de l'histoire s'époustouflé. Comment préserver l'historique de sorte que si l'utilisateur actualise la page, le bouton de retour est toujours utile?

Répondre

2

Je viens de le tester avec Firefox et Chrome pour mon application et l'actualisation de la page ne pas effacer l'historique. Quel navigateur utilisez-vous? Avez-vous le

<iframe src="javascript:''" id='__gwt_historyFrame' style='position:absolute;width:0;height:0;border:0'></iframe> 

dans votre code HTML?

+0

Oui, le cadre de l'histoire était en place. Il s'avère que ce n'est pas un problème technique sous mon contrôle et je me sens plutôt bête maintenant de demander. Quelques choses étaient en jeu. Premièrement, le navigateur GWT perd l'historique à l'actualisation (parfois j'oublie de compiler). Deuxièmement, IE agit étrangement en ce qui concerne l'histoire. Troisièmement, quelques développeurs ne poussaient pas correctement les jetons d'histoire sur la pile. Merci d'avoir jeté un coup d'oeil à ceci pour moi, désolé pour le problème. – Michael

1

GWT a résolu ce problème en fournissant l'objet Historique. En faisant un appel à sa méthode statique History.newItem("your token"), vous serez en mesure de passer un jeton dans votre chaîne de requête.

Cependant, vous devez savoir que chaque fois qu'un changement d'historique est effectué dans une application gwt, l'événement onValueChange(ValueChangeEvent event){} est déclenché et, dans la méthode, vous pouvez appeler les pages appropriées. Voici une liste des étapes que j'utilise pour résoudre ce problème.

  1. Ajoutez un écouteur de clic à l'objet qui a besoin d'appeler une nouvelle page. Lors de la gestion de l'événement, ajoutez un jeton au history.(History.newItem("new_token").

  2. Implémentez le ValueChangeHandler dans la classe qui implémente votre EntryPoint.

  3. Ajoutez onValueChangeHandler(this) à la classe qui implémente EntryPoint. Assurez-vous que la ligne est ajouter dans la méthode onModuleLoad() (il est important, il est ajouté dans cette méthode) de la classe qui implémente le point d'entrée (ha assez évident!)

  4. Enfin mettre en œuvre onValueChange(ValueChangeEvent event) {// appeler une nouvelle page} méthode.

C'est ce