2

GWT アプリケーションに [前へ] ボタンがあり、 History.back()を呼び出すイベント ハンドラーをアタッチしました。

eventBus.addHandler(PrevEvent.TYPE, new PrevEventHandler() {
        public void onNext(PrevEvent prevEvent) {
            History.back();
            System.out.println("Token is" +History.getToken());

        }
    });

イベントが発生すると、ブラウザーで URL トークンが変更されていることがわかりますが、History.getToken()は最近のトークン自体を出力しています。たとえば、トークンが #A、#B、#C の順に追加された場合、# C にいるときに [前へ] をクリックすると、URL は#Bに変わりますが、getToken は#Cと表示されます。これがonValueChangeメソッドを 呼び出さないという問題を引き起こしていると思うので、アプリは同じままです。

ブラウザの戻るボタンを押してみると、同じことが観察されます。私は firefox を使用していますが、他のブラウザーでの動作は同じです。

その理由は何ですか?

私の認識では、History.back()onValueChange()を起動しますが、今ではHistory.newItem()だけがその仕事を行うことができるようです。私が間違っている場合は修正してください。私は混乱しています。の ボタンイベントを処理するにはどうすればよいですか?

       eventBus.addHandler(PrevEvent.TYPE, new PrevEventHandler() {
        public void onNext(PrevEvent prevEvent) {
            History.back();
            System.out.println("Token is" +History.getToken());
            doPrev();
        }
    });


    private void doPrev(){
       System.out.println("Calling Previous Method");
 }

アプリのどこかで、現在の履歴トークン #Step3 を使用したコードが前のイベントを発生させます。したがって、前のイベントになると、History.back() を実行し、トークンが #Step2 に戻ることを期待し、次のような onValueChange メソッドを持っています。

    public void onValueChange(ValueChangeEvent<String> event) {

    String token = event.getValue();

    if(token != null){
         presenter = null;

    if(token == "step1")
    {
        System.out.println("Step 1");
        //do Something

    }
    else if(token == "step2")
    {
        System.out.println("Step 2");
                    //do Something      
    }
            else if(token == "step3")
    {
        System.out.println("Step 3");
                    //do Something      
    }
4

1 に答える 1

3

History.back() には長い時間がかかるようです (文字通り長い、約 100 ミリ秒 :))

私はそれをテストするためにいくつかのコードを書きました:

    public void onModuleLoad()
{
    History.newItem("A");
    History.newItem("B");
    History.newItem("C");
    RootPanel.get().add(new Button("back", new ClickHandler()
    {

        @Override
        public void onClick(
            ClickEvent event)
        {
            System.out.println("After back click token is " + History.getToken());
            History.back();
            new Timer()
            {

                @Override
                public void run()
                {
                    System.out.println("After 100 millis token is " + History.getToken());
                }
            }.schedule(100);
        }
    }));
    History.addValueChangeHandler(new ValueChangeHandler<String>()
    {

        @Override
        public void onValueChange(
            ValueChangeEvent<String> event)
        {
            System.out.println("We handle ValueChangeEvent on History. Now token is " + History.getToken());
        }
    });
}

Google chromeでの出力は次のとおりでした

After back click token is C
After 100 millis token is C
We handle ValueChangeEvent on History. Now token is B
After back click token is B
We handle ValueChangeEvent on History. Now token is A
After 100 millis token is A
After back click token is A
We handle ValueChangeEvent on History. Now token is C
After 100 millis token is C

あなたが望んでいた答えではありませんが、コメントするには大きすぎます:)

于 2012-07-10T10:21:16.387 に答える