История GWT demo - не работает

Некоторое время я играл с History в gwt, потому что я намерен реализовать его в моем текущем проекте, поэтому я создал небольшой демонстрационный проект, чтобы посмотреть, как он работает, и немного попрактиковаться. Так что по некоторым причинам это не работает. Вот код - очень простой назад и вперед.

вот iframe

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

затем точка входа

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);

}
} 

и 3 одноэлементные формы, содержимое, в которое загружается форма, и 2 формы.

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;
}
}

и ..

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());
}

}

и последнее, но не менее важное :))

    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());
    }
    }

Проблема в том, что я нажимаю кнопку в FirstPanel, и SecandPanel загружается, а затем нажимаю «Назад» в браузере ничего не делает. В методе onHistoryChanged параметр historyToken представляет собой пустую строку, не должно быть значением из стека (first_page)?

Буду признателен, если кто-то найдет проблему или объяснит, где я делаю ошибки.

Спасибо


person adgfs    schedule 27.06.2011    source источник


Ответы (1)


При загрузке первой страницы вы вызываете onHistoryChanged(INIT_STATE) вручную. Это не меняет истории. Замените на это:

public FirstPanel() {

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

    .. rest of code

Лучшей практикой было бы регистрировать слушателей истории History.addHistoryListener(..) только на самой верхней панели (EntryPoint или ContentPanel) и переключать панели на основе истории оттуда.

person Peter Knego    schedule 27.06.2011
comment
Вы имеете в виду, что на панели верхнего уровня должен быть только один слушатель, верно? - person adgfs; 27.06.2011
comment
Я понимаю, что это старый ответ, но addHistoryListener устарел. Это должно использоваться сейчас: History.addValueChangeHandler (новый ValueChangeHandler ‹String› () {public void onValueChange (ValueChangeEvent ‹String› событие) { - person rjdkolb; 10.11.2014