Как перестроить стек истории GWT? - PullRequest
0 голосов
/ 20 июня 2009

У меня есть приложение большего размера, с которым я работаю, но в документации 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());
    }
}

Проблема в том, что если вы обновите приложение, стек истории будет уничтожен. Как сохранить историю, чтобы, если пользователь обновляет страницу, кнопка «Назад» все еще была полезна?

Ответы [ 2 ]

2 голосов
/ 21 июня 2009

Я только что протестировал его с Firefox и Chrome для своего приложения, и обновление страницы не очищает историю. Какой браузер вы используете? У вас есть

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

в вашем HTML?

1 голос
/ 02 октября 2010

GWT решил эту проблему, предоставив объект History.Сделав вызов его статического метода History.newItem("your token"), вы сможете передать токен в строку запроса.

Однако вы должны знать, что в любое время происходит изменение истории в приложении gwt,событие onValueChange(ValueChangeEvent event){} вызывается, и в методе вы можете вызывать соответствующие страницы.Ниже приведен список шагов, которые я использую для решения этой проблемы.

  1. Добавьте прослушиватель щелчка к объекту, который тоже должен вызвать новую страницу.При обработке события добавьте токен к history.(History.newItem("new_token").

  2. Реализуйте ValueChangeHandler в классе, который реализует вашу EntryPoint.

  3. Добавьте onValueChangeHandler(this) слушатель к классу, который реализует EntryPoint.Убедитесь, что строка добавлена ​​в метод onModuleLoad() (важно, что он добавлен в этот метод) класса, который реализует EntryPoint (довольно очевидно, ха!)

  4. Наконец, реализуйтеonValueChange(ValueChangeEvent event) {// вызов новой страницы} метод.

Вот и все

...