1

ユーザーが文字を入力できるテキストボックスがあり、提案ボックスが開きます。キーアップイベントでイベントを発生させました。タイマーが設定された後、非同期呼び出しが開始され、非同期呼び出しが成功すると、提案リストがロードされます。問題は、文字の入力を開始すると、ブラウザの読み込み記号が表示され、非同期呼び出しが正常に返され、提案が表示されるまで、テキストボックスにそれ以上文字を入力できないことです。重要なのは、呼び出しが非同期の場合、ブラウザーがUIのイベントをブロックする理由です。

以下はコードです。火災イベントは非同期呼び出しを呼び出し、火災イベントの終了メッセージを出力します。したがって、非同期呼び出しはブロックされません。public void showSuggestions(final String query){

    ArrayList<PCTSuggestion> list;
    System.out.println("Show Suggestions");
    if (query.length() > 0) {
        GWT.log(query);
       list = cacher.getCachedvalues(query);
       //list = new ArrayList<PCTSuggestion>();
       if(list != null) {
            if(!isTabOut() || !isBlurred()) {
                display.showSuggestions(PCTSuggestBox.this, list, true, isAutoSelectEnabled(), suggestionCallback);
            } else {
                display.hideSuggestions();
            }
        } else {

             this.fireEvent(new NewSuggestionEvent(query, limit));    
             System.out.println("End of Fire Event");

        }
        //display.showSuggestions(PCTSuggestBox.this, null, true, isAutoSelectEnabled(), suggestionCallback);
    } else {
        display.hideSuggestions();
    }
}
4

2 に答える 2

1

テキストボックスなどの入力のすべてのキーストロークで非同期呼び出しを行うことは避けてください。

Google 検索の入力候補に表示されるものは、GWT ではありません。

入力時に提案を実装したい場合、GWT で適切に実装する方法がわかりません。アプリケーションを JavaScript で作成する必要があります。入力時に提案するサービスは、別の非表示の分離フレーム/iframe にあります。keyup ハンドラーは、そのフレームと通信します。そうすれば、(私が正しいというわけではありませんが)、テキストボックスの i/o が非同期通信と衝突することはないと思います。

おそらく、Google JavaScript クロージャー ツールhttp://code.google.com/closure/を検討する必要があります。

GWT を使用すると、サーバーベースの偶数バスを経由せずに、別のフレームに配置される別の GWT アプリケーションに対処することがほとんど不可能になります。

相互に参照して通信する必要がある 2 つ以上のフレームがその親フレームの子である必要があるように、調整する親フレームが必要です。

ただし、JavaScript でそのような記述を実現できます。javacript で作成すると、GWT のすべての束縛から解放されます。

その後、おそらくそのサービスを JSNI 呼び出しにラップして、引き続き GWT をレイアウトに使用できるようにすることができます。私が見る問題は、JSNI によって呼び出される外部 Javascript にテキスト ボックスを表示するにはどうすればよいかということです。おそらく、テキストボックスに ID を与えることでしょうか? しかし、ちょっと待ってください。GWT はウィジェットに ID を与えたくありません。確実なdebugIDを割り当てることができますが、それは本番コードで機能しますか?

テキストボックスの uibinder で HTML 要素を使用できます。また、uibinder を使用すると、ID を HTML 要素に割り当てることができます。ただし、入力テキスト ボックスの値を dom から読み取る必要があります。この方法で GWT と JavaScript を混在させようとしたことは一度もありません。私の思考実験です。

于 2011-12-28T05:21:44.803 に答える
1

それが起こっている理由は1000あります。AsyncCallbacks はそれほど非同期ではありません。実際の HTTP リクエストが送信されたときにのみ、UI スレッドをブロックしません。ただし、リクエストの構築、レスポンスの解析、およびコールバック本体の処理は、通常どおり UI スレッドで行われます。考えられる犯人:

  • 途方もない量のデータがネットワーク経由で送信されます
  • 受信データの無効な処理
  • 提案の非効果的なレンダリング
  • devmode で Chrome を使用する (Chrome は devmode では非常に遅くなります)

コードのどの部分が遅いかを実際に測定する方が簡単だからです。

于 2011-12-27T13:12:22.083 に答える