Как исправить димму в управляющем интерфейсе при входе пользователя в GWTP?

Хорошо, вот моя дилемма:

У меня есть ведущий Header, который является вложенным. Презентатор Customer является дочерним элементом ведущего Header (т. Е. Ведущий Customer был помещен в слот ведущего Header).

В ведущем заголовка есть панель входа.

-Итак, вот требования:

-Пользователи не могут видеть Gui of Customer Presenter, если они еще не вошли в систему.

-При успешном входе в систему пользователь увидит графический интерфейс ведущего клиента.

Когда пользователь обновляет страницу, система проверит, вошел ли пользователь в систему. Если он / она вошел в систему, то система покажет Gui ведущего клиента. Если он / она не вошел в систему, то выдаст сообщение об ошибке.

Итак, вот что я сделал.

В Header Presenter у меня есть метод loginedSuccessfully()этот метод будет passUserInfo() (использование eventBus) в докладчик.

В Customer Presenter у меня есть:

private int custID=0;
public void onReset(){
   super.onReset();
   if(custID>0){
       showGui();
   }
   else{
       hideGui(); // the hideGui() has Window.alert("Pls Login");
   }
}
private PassUserInfoHandler passUserInfoHandler=new PassUserInfoHandler(){

    @Override
    public void onPassUserInfo(PassUserInfoEvent event) {
       custID=event.getCustID();
       if(custID>0){
           showGui();
       }
       else{
          hideGui();
       }
    }

};

Когда пользователь обновляет страницу клиента. onResetбудет вызван, если клиент еще не вошел в систему, то он не будет отображать Gui и подскажет сообщение.

Когда пользователь входит в систему, нажав кнопку входа, то passUserInfoHandler будет вызван и он покажет Gui, если вошли в систему ок.

Но здесь есть проблема. Когда пользователь уже вошел в систему и если я открою новую вкладку браузера и снова открою страницу клиента, то на этот раз onReset & passUserInfoHandler Waere звонил, и страница предлагает сообщение ДВАЖДЫ. Это не хорошо.

Но почему это случилось?

Это потому что onReset был вызван до passUserInfoHandler назывался. Поэтому метод проверки графического интерфейса вызывался 2 раза.

я использовал Scheduler.get().scheduleDeferred(new Command() {}; но это не сработало.

Знаете ли вы, как решить проблему, чтобы она соответствовала всем вышеперечисленным требованиям?

1 ответ

Решение

GWTP - это полноценная архитектура. У него также есть такой API, что вы можете помешать некоторым докладчикам раскрыть себя, создав свои собственные классы Gatekeeper. Например, если вы хотите, чтобы некоторые докладчики были доступны только при входе пользователя в систему, вы можете написать следующий класс:

@Singleton
public class LoggedInGatekeeper implements Gatekeeper {  

  private final CurrentUser currentUser;

  @Inject
  public LoggedInGatekeeper (
      final CurrentUser currentUser ) {
    this.currentUser = currentUser;
  }

  @Override
  public boolean canReveal() {
    return currentUser.isLoggedIn();
  }
}

Затем вам просто нужно добавить аннотацию @UseGatekeeper к прокси каждого докладчика, которого вы хотите защитить:

  @ProxyCodeSplit
  @NameToken("userSettings")
  @UseGatekeeper( LoggedInGatekeeper.class )
  public interface MyProxy extends ProxyPlace<MainPagePresenter> {}

Я думаю, что вы должны пойти на это, а не писать вещи вручную. Даже один раз может быть ваш код работает. но в особенности в вашем коде появится новая ошибка. Вы можете сослаться на этот GWTP.

Другие вопросы по тегам