2011-06-27 3 views
1

J'ai joué pendant un certain temps avec History dans gwt parce que j'ai l'intention de l'implémenter dans mon projet actuel, j'ai donc créé un petit projet de démonstration juste pour voir comment ça marche et m'entrainer. Donc, pour certaines raisons, cela ne fonctionne pas. Voici le code - très simple en arrière et en avant.Historique GWT demo - ne fonctionne pas

ici est le iframe

<iframe id="__gwt_historyFrame" style="width:0;height:0;border:0"></iframe> 

alors le point d'entrée

public class EntryPoint implements com.google.gwt.core.client.EntryPoint { 

private FirstPanel panel; 

public void onModuleLoad() { 

    ContentPanel panel = ContentPanel.getInstance(); 
    panel.setContent(FirstPanel.getInstance()); 
    RootPanel.get().add(panel); 

} 
} 

et 3 formes uniques, où le contenu forme sont chargés et 2 forment.

public class ContentPanel extends Composite 
{ 
private static ContentPanel instance; 
private static VerticalPanel panel = new VerticalPanel(); 
private ContentPanel() 
{ 
    initWidget(panel); 
} 

public void setContent(Widget widget) 
{ 
    panel.clear(); 
    panel.add(widget); 
} 
public static ContentPanel getInstance() 
{ 
    if(instance == null) 
    return instance = new ContentPanel(); 
    else 
    return instance; 
} 
} 

et ..

public class FirstPanel extends Composite implements HistoryListener { 

private static FirstPanel instance; 
private VerticalPanel panel; 

public FirstPanel() { 

    History.addHistoryListener(this); 

    panel = new VerticalPanel(); 
    panel.setStyleName("panelstyle"); 

    Button button2 = new Button("Next page"); 
    button2.addClickHandler(new ClickHandler() 
    { 
    public void onClick(ClickEvent event) 
    { 
     History.newItem("second_page"); 
    } 
    }); 
    panel.add(button2); 
    initWidget(panel); 
} 

public static FirstPanel getInstance() 
{ 
    if(instance == null) 
    return instance = new FirstPanel(); 
    else 
    return instance; 
} 

public Widget getWidget() { 
    return panel; 
} 

public void onHistoryChanged(String historyToken) { 
if(historyToken.equalsIgnoreCase("second_page")) 
    ContentPanel.getInstance().setContent(SecondPanel.getInstance()); 
} 

} 

et last but not least :))

public class SecondPanel extends Composite implements HistoryListener 
    { 
    private static SecondPanel instance; 
    public SecondPanel() 
    { 
     History.addHistoryListener(this); 
     VerticalPanel verticalPanel = new VerticalPanel(); 
     TextBox firstnameBox = new TextBox(); 
     TextBox lastnameBox = new TextBox(); 
     Button submitButton = new Button("Click"); 

     verticalPanel.add(firstnameBox); 
     verticalPanel.add(lastnameBox); 
     verticalPanel.add(submitButton); 

     submitButton.addClickHandler(new ClickHandler() 
     { 
     public void onClick(ClickEvent event) 
     { 
      History.newItem("first_panel"); 
      alert("You are in second panel"); 
     } 
     }); 
     initWidget(verticalPanel); 
    } 

    public static SecondPanel getInstance() 
{ 
    if(instance == null) 
     return instance = new SecondPanel(); 
    else 
     return instance; 
} 
    public void onHistoryChanged(String historyToken) 
    { 
     if(historyToken.equalsIgnoreCase("first_panel")) 
     ContentPanel.getInstance().setContent(FirstPanel.getInstance()); 
    } 
    } 

Le problème est que je clique sur le bouton dans FirstPanel et SecandPanel est chargé puis appuyez sur " Retour "dans le navigateur ne fait rien. Dans la méthode onHistoryChanged le param historyToken est une chaîne vide, ne devrait pas être une valeur de la pile (first_page)?

Je serai reconnaissant si quelqu'un trouve le problème ou m'explique où je fais des erreurs.

Merci

Répondre

3

Sur la première page de chargement que vous appelez onHistoryChanged(INIT_STATE) à la main. Cela ne change pas l'histoire. Remplacer par ceci:

public FirstPanel() { 

    History.addHistoryListener(this); 
    String token = History.getToken(); 
    if (token.length() == 0) { 
     History.newItem(INIT_STATE); 
    } else { 
     History.fireCurrentHistoryState(); 
    } 

    .. rest of code 

Une meilleure pratique serait d'enregistrer les auditeurs d'histoire History.addHistoryListener(..) seulement dans le panneau supérieur le plus (ou EntryPoint ContentPanel) et des panneaux de commutation en fonction de l'histoire à partir de là.

+0

Merci Peter, vous avez raison.Il fonctionne! – adgfs

+0

Vous voulez avoir un seul auditeur sur un panneau de haut niveau, n'est-ce pas? – adgfs

+0

Oui, cela rendrait le code plus lisible. –

Questions connexes