Как очистить корневую панель перед отображением следующего представления

#java #html #gwt #paypal

#java #HTML #gwt #paypal

Вопрос:

Я использую GWT Java и пытаюсь удалить кнопку пожертвования PayPal (т. Е. Очистить корневую панель), которая является частью HTML-формы, при переходе из LoginView в другое представление. Я обнаружил, что мне следует использовать:

     RootPanel.get("payPalDonate").clear();
    RootPanel.get().clear();
    RootPanel.get().getElement().setInnerHTML("");
  

Это очищает форму, поэтому она не отображается в следующем представлении; однако, когда отображается следующее представление, кнопки, гиперссылки и кнопка возврата браузера в представлении не работают.

Код находится в :

 private void checkWithServerIfSessionIdIsStillLegal(String sessionID) {

    rpc = (DBConnectionAsync) GWT.create(DBConnection.class);
    ServiceDefTarget target = (ServiceDefTarget) rpc;
    String moduleRelativeURL = GWT.getModuleBaseURL()   "MySQLConnection";
    target.setServiceEntryPoint(moduleRelativeURL);

    AsyncCallback<Account> callback = new AuthenticationHandler<Account>();
    rpc.loginFromSessionServer(callback);
}

class AuthenticationHandler<T> implements AsyncCallback<Account> {
    @Override
    public void onFailure(Throwable caught) {
        RootPanel.get().add(new LoginView());
    }

    @Override
    public void onSuccess(Account result) {
        if (result == null) {
            RootPanel.get().add(new LoginView());
        } else {
            //if (result.getLoggedIn()) {
                RootPanel.get().clear();
                //RootPanel.get().add(new SelectPersonView());
                RootPanel.get().add(new LoginView());
            //} else {
                //RootPanel.get().add(new LoginView());
            //}
        }
    }

}

public void onValueChange(ValueChangeEvent<String> event) {

    RootPanel.get("payPalDonate").clear();
    RootPanel.get().clear();
    RootPanel.get().getElement().setInnerHTML("");

    //Get the historyToken value
    String historyToken = event.getValue();

    //Check the historyToken
    if (historyToken.startsWith("!"))
        historyToken = historyToken.substring(1);

    if (historyToken.length() == 0) {   
        //Initial entry
        RootPanel.get().clear();
        RootPanel.get().add(new LoginView());
    } else if (historyToken.equals("login")) {
        RootPanel.get().clear();
        RootPanel.get().add(new LoginView());
    } else if (historyToken.equals("goToVideo")) {
        RootPanel.get().clear();
        Window.Location.replace("https://www.youtube.com/user/GlyndwrBartlett");
    } else if (historyToken.equals("goToMetawerx")) {
        RootPanel.get().clear();
        Window.Location.replace("https://www.metawerx.net/");
    } else if (historyToken.equals("goToPrivacy")) {
        RootPanel.get().clear();
        RootPanel.get().add(new SecurityAndPrivacyView());
    } else if ...
  

В LoginView:

     initWidget(verticalPanel);
    RootPanel.get("payPalDonate");
  

В html:

        <div style="margin:auto" id="payPalDonate">
            <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
                <input type="hidden" name="cmd" value="_s-xclick">
                <input type="image" src="https://www.paypalobjects.com/en_AU/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal – The safer, easier way to pay online!">
                <img alt="" border="0" src="https://www.paypalobjects.com/en_AU/i/scr/pixel.gif" width="1" height="1">
            </form>
        </div>
  

Ответ №1:

Обычно в GWT корневая панель никогда не очищается. Когда вы запускаете свое приложение, вы передаете контейнер на корневую панель, а затем все представления добавляются в этот контейнер и удаляются из него.

Лично я использую шаблон Activities и Places для всех своих приложений. По этой ссылке приведен пример того, как изменять представления в главном контейнере.

Ответ №2:

Я читаю ссылку, предоставленную Андреем. Тем временем я обнаружил, что проблемы были устранены:

 RootPanel.get().getElement().setInnerHTML("");
  

Я пытался:

 RootPanel.getBodyElement().removeChild(RootPanel.get("payPalDonate").getElement());
  

Однако в этом случае возникла та же проблема. В итоге я нашел это https://groups.google.com/forum /#!topic/google-web-toolkit/zVvY39blkY4

Итак, я заменил нарушающий код на:

 RootPanel.get("payPalDonate").setVisible(false);
  

И я поместил код в LoginView непосредственно перед передачей управления другому представлению. Не самый элегантный; однако, он работает, пока я не переварю информацию, предоставленную Андреем.