如何在显示下一个视图之前清除 RootPanel

Posted

技术标签:

【中文标题】如何在显示下一个视图之前清除 RootPanel【英文标题】:How to clear the RootPanel before displaying the next view 【发布时间】:2017-03-03 07:07:50 【问题描述】:

我正在使用 GWT Java,当我从 LoginView 移动到另一个视图时,我正在尝试删除作为 html 表单的一部分的 PayPal Donate 按钮(即清除 RootPanel)。我发现我应该使用:

    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 ...

在登录视图中:

    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" >
                <img  border="0" src="https://www.paypalobjects.com/en_AU/i/scr/pixel.gif"  >
            </form>
        </div>

【问题讨论】:

【参考方案1】:

我正在阅读 Andrei 提供的链接。与此同时,我发现这些问题是通过以下方式解决的:

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 中。不是最优雅的;但是,在我消化了 Andrei 提供的信息之前,它一直有效。

【讨论】:

【参考方案2】:

通常在 GWT 中,RootPanel 永远不会被清除。当您启动应用程序时,您将一个容器传递给 RootPanel,然后将所有视图添加到该容器中或从该容器中删除。

就我个人而言,我的所有应用都使用Activities and Places 模式。此链接提供了如何更改主容器中的视图的示例。

【讨论】:

以上是关于如何在显示下一个视图之前清除 RootPanel的主要内容,如果未能解决你的问题,请参考以下文章

聊天视图中的重复消息。如何清除视图?

如何在iphone中更改下一个视图之前突出显示按钮?

如何清除数据网格视图

将其设置为清除后,Swift 模态视图背景显示为黑色

如何在 Android 中展开的 SearchView(显示 10 个最近搜索)下方添加一个按钮(如“清除历史记录”)?

在切换视图时清除文本字段和文本视图视图的数据