1

即使它在我使用时被正确触发History.fireCurrentHistoryState();

编辑:同一个包中的所有类。代码更新 -

测试历史.java

public class TestHistory implements EntryPoint, ValueChangeHandler<String> {

    static boolean isLoggedIn = false;
    static final String PAGENAME = "mainscreen";
    public void onModuleLoad()
    {
        History.addValueChangeHandler(this);

        String startToken = History.getToken();
        System.out.println("onModuleLoad Called..... start token= -------"+startToken+"--------");
        if(!startToken.isEmpty())
            History.newItem(startToken);
        History.fireCurrentHistoryState(); //to execute onValueChange 1st time since 1st time history is not setup
    }

    @Override
    public void onValueChange(ValueChangeEvent<String> event) {

        String token = event.getValue();

        String args = "";
        int question = token.indexOf("?");
        if (question != -1) {
        args = token.substring(question + 1);
        token = token.substring(0, question);
        }

        if(!isLoggedIn)
        {
            if(token.isEmpty() || "login".equals(token))    //1st time opened the site normally
                new Login().display(false, RootPanel.get());
            else {
                new Login().display(true, RootPanel.get());
            }
        }
        else    //User has logged in
        {
            if(token.isEmpty() || "login".equals(token))
            {
                if(isLoggedIn)
                    Window.alert("Ur already logged in!!!");
                else
                    new Login().display(false, RootPanel.get());
            }
            else if("withdraw".equals(token))
                new Withdraw().display(RootPanel.get(), args);
            else if("deposit".equals(token))
                new Deposit().display(RootPanel.get(), args);
            else //token not clear
                Window.alert("Unrecognized token=" + token);
        }   

    }

}

登录.java

public class Login {
    static final String PAGENAME = "login";
    void display(final boolean hasTypedSomeToken, Panel myPanel) //Process login
    {
        System.out.println("login display called");
        Label displayLabel = new Label("This is the Login Page");
        Label enterName = new Label("Enter ur name");
        final TextBox txtName = new TextBox();
        Label enterPasswd = new Label("Enter ur Passwd");
        final TextBox txtPasswd = new TextBox();
        Button btnLogIn = new Button("Login", new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {

                /* Real app will check DB. Here we r jst chckng d txt fields hv value */
                if(txtName.getValue().length()>0 && txtPasswd.getValue().length()>0)
                {
                    TestHistory.isLoggedIn = true;
                    if(hasTypedSomeToken) {
                        //History.back(); //send him to the URL(token) he bookmarked b4 loggin in
                        History.newItem("login",false);
                        History.back();
                        System.out.println(History.getToken());
                    }
                    else{
                        myPanel.clear();
                                            Label displayLabel = new Label("Thank U for logging.);
                                            myPanel.add(displayLabel);
                                         }

                }   
            }
        });         
        myPanel.clear();
        myPanel.add(displayLabel);
        myPanel.add(enterName);
        myPanel.add(txtName);
        myPanel.add(enterPasswd);
        myPanel.add(txtPasswd);
        myPanel.add(btnLogIn);
    }
}

存款.java

public class Deposit {
    static final String PAGENAME = "deposit";
    void display(Panel myPanel, String param)
    {
        System.out.println("deposit display called");
        myPanel.clear();
        Label displayLabel = new Label("This is the Deposit Page & ur parameter = "+param+")");
        myPanel.add(displayLabel);
    }   
}

取款.java

//类似于deposit.java

4

2 回答 2

2

问题在于 History.newItem() 的使用。当我使用带书签的 url 并使用新令牌调用 History.newItem() 时,问题就出现了。由于同一个内部页面已经存在一个令牌,并且我给它一个新令牌,因此存在一些混乱并且没有调用 onValueChange()。

现在我很清楚,当没有标记附加到当前视图以用标记标记视图时,应该使用 History.newItem() 。一般当用户正常打开一个站点时(没有token),我们应该使用history.newItem来标记第一个视图。

另外值得注意的是 History.fireCurrentHistoryState() 只是使用当前令牌调用 onValueChange 。通过查看 GWT 的代码,我发现 History.newItem() 只需调用 History.fireCurrentHistoryState()

实际上,如果我更换

if(!startToken.isEmpty())
            History.newItem(startToken);
        History.fireCurrentHistoryState();

在我的代码中

   if(startToken.isEmpty())
            History.newItem("login");
        else
            History.fireCurrentHistoryState();

&也是代码

if(hasTypedSomeToken) {
                        //History.back(); //send him to the URL(token) he bookmarked b4 loggin in
                        History.newItem("login",false);
                        History.back();
                        System.out.println(History.getToken());
                    }

if(hasTypedSomeToken) {
                    History.fireCurrentHistoryState();
                    System.out.println("getToken() in Login =   "+History.getToken());
                }

它工作得很好。

于 2011-12-18T13:01:35.710 回答
1

尽管newItem(...)通常会触发一个事件,但如果当前令牌与您尝试添加的令牌相同,则它是无操作的。如果不是这种情况,则说明您的实施存在问题。

于 2011-12-17T19:22:50.063 回答