历史 GWT 演示 - 不起作用

发布于 2024-11-17 11:28:21 字数 3287 浏览 2 评论 0原文

我在 gwt 中使用 History 已经有一段时间了,因为我打算在我当前的项目中实现它,所以我创建了一个小型演示项目,只是为了看看它是如何工作的并做一些练习。 因此,由于某些原因它不起作用。 这是代码 - 非常简单的前后移动。

这是 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)吗?

如果有人发现问题或解释我在哪里出错,我将不胜感激。

谢谢

I have played for a while with History in gwt because i intend to implement it in my current project, so i created a small demo project just to see how it works and do some practice.
So, for some reasons it does not work.
Here is the code - very simple back and forward.

here is the iframe

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

then the entry point

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

}
} 

and 3 singleton forms, content where form are being loaded and 2 form.

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

and ..

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

}

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

The problem is that i click the button in FirstPanel and SecandPanel is loaded then press "Back" in the browser does not do anything.In onHistoryChanged method the param historyToken is empty string, should't be a value from the stack (first_page)?

I will be grateful if someone find the problem or explain me where i do mistakes.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

念﹏祤嫣 2024-11-24 11:28:21

在首页加载时,您将手动调用 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

更好的做法是仅在最顶部的面板(EntryPoint 或 ContentPanel)中注册历史侦听器 History.addHistoryListener(..) ,并根据那里的历史记录切换面板。

On first page load you are calling onHistoryChanged(INIT_STATE) by hand. This does not change history. Replace with this:

public FirstPanel() {

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

    .. rest of code

Better practice would be to register History listeners History.addHistoryListener(..) only in the top-most panel (EntryPoint or ContentPanel) and switch panels based on history from there.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文