GWT: как мне перейти в новое место из метода запуска действия?

#java #gwt

#java #gwt

Вопрос:

Итак, я делаю что-то вроде этого:

 public class SecureActivity extends AbstractActivity {
  public void start(AcceptsOneWidget container, EventBus eventBus) {    
    if (!_app.isUserLoggedIn()) {
      _app.goTo(new LoginPlace(_app.getCurrentPlaceToken()))
    } else {
      // do cool secure stuff
    }
  }
}
  

Но поведение, которое я вижу, заключается в том, что история моего браузера относится к исходному URL (из исходного запроса), затем login:redirectPlace, а затем снова к исходному url.

Похоже, мне нужно выполнить перенаправление после завершения метода start(). Есть ли правильный способ отложить / делегировать это goTo, чтобы оно происходило вне метода запуска?

Спасибо.

Комментарии:

1. Ответ Томаса — один из способов обойти это. Возможно, вы захотите немного подумать о том, как ваши места сопоставляются с действиями, потому что, если ваша активность сразу перенаправляется на новое место при ее запуске, вы помещаете токен в историю пользователя, который не будет иметь для них смысла. Вместо этого вы могли бы вставить свое условие if (!_app.isUserLoggedIn()) в свой ActivityMapper и запустить LoginActivity вместо запуска SecureActivity, а затем поменять места, чтобы перейти к LoginActivity. (т. Е. Вам не всегда нужно сопоставлять места с действиями 1 к 1).

2. Бен, это отличное предложение. Я думал о сопоставлении 1 к 1. В частности, я настраивал SecureActivity на выполнение роли проверки авторизации. Если я перемещу это в mapper, после успешного входа в систему, использую ли я places для повторной попытки перехода в исходное место? Или мне вручную вызывать вызовы моего картографа, чтобы запустить это действие?

3. Это хороший вопрос! О чем я забыл, так это о том, что вы не можете goTo() место, в котором вы уже находитесь, так что вы правы, вам придется вручную запускать новое действие (что кажется не совсем правильным). Это, вероятно, заслуживает отдельного вопроса; возможно, команда GWT подскажет, что делать.

Ответ №1:

Этого должно быть достаточно:

 Scheduler.get().scheduleFinally(new ScheduledCommand() {
   @Override
   public void execute() {
      _app.goTo(new LoginPlace(_app.getCurrentPlaceToken());
   }
}