2

私はGWTが初めてです。MultiWordSuggestOracleを使用して入力された単純なSuggestBoxがあります。ユーザーはこの SuggestBox にデータを入力し、既存の提案と一致するものが見つかった場合はそれで十分です。以下のように、SelectionHandler コードでこの値を取得できます。

    display.getSuggestBox().addSelectionHandler(new SelectionHandler<Suggestion>() {

        public void onSelection(SelectionEvent<Suggestion> event) {

            String selectedProperty =   ((SuggestBox)event.getSource()).getValue();
            // do something with the property value
        }
    });

しかし、ユーザーは提案オラクルにまだない値を入力することができます。その場合、この値を読み取って何かを行う必要があり、新しいデータとして db に保存される可能性があります。(私が探しているのは提案を表示するブラウザのナビゲーション ウィジェットのようなもので、ユーザーは提案を拾ったり、新しいエントリを入力して続行したりできます。ユーザーが入力したこの新しいテキストを取得する方法が必要でしたか? ボタンクリックでデータを読み込みます。私が試したのはこれです。

    display.getSaveBtn().addClickHandler(new ClickHandler() {

        public void onClick(ClickEvent event) {


                String selectedProperty = display.getSuggestBox().getValue();
                //String selectedProperty2 = display.getSuggestBox().getText();

    // Blank in both cases :(
    // tried display.getSuggestBox().getTextBox().getValue(),but blank again

        }

    });

onChange() イベント ハンドラーを使用しようとしました (以下に示すように)

    display.getSuggestBox().addValueChangeHandler(new ValueChangeHandler<String>() {

        public void onValueChange(ValueChangeEvent<String> event) {
            String selectedProperty = ((SuggestBox)event.getSource()).getValue();
            Window.alert("on change -- "+selectedProperty);

        }
    });

これは、1 つのシナリオを除いて正常に機能しています。オラクルに「createTicketWsdl」と「createTicketTimeout」という 2 つの提案があるとします。ユーザーが'cr'と入力すると、これら 2 つのオプションが選択されます。キーボードの ENTER を押して'createTicketWsdl' を選択すると、私のアラートは正しい 'createTicketWsdl' を出力します。しかし、彼がmouse を使用して'createTicketWsdl' を選択すると、私のアラートは'cr'を出力します (理解を深めるためにスクリーンショットを投稿しようとしましたが、新しいユーザーであるため許可されていません)。 「createTicketWsdl」というのは、彼が選択したものだからです)。アラートを出力した直後に、SuggestBox の値が「createTicketWsdl」に変わります。

提案ボックスの値を取得する方法はありますか? カスタムウィジェットのソースコードが利用可能な同様のスレッドGWT SuggestBox + ListBox Widgetを見ました。しかし、私が望むのは単に SuggestBox から現在の値を取得することであり、簡単な方法があればいいのにと思っているので、それを試すのに苦労しませんでした。

ご助力いただきありがとうございます!

4

1 に答える 1

1

あなたの質問はあまり明確ではありません。あなたの言語を少し明確にする必要があります。たとえば、次は質問ですか、それとも主張ですか? つまり、主張のように聞こえますが、疑問符が付いています。

私が必要としていたのは、ユーザーが入力したこの新しいテキストを取得する方法ですか?

また、「 」の意味がわかりませんhe is opted by。「 」と言いたかったのですhe is presented with the options ...か?

したがって、私はあなたの状況を推測しています。

  1. 既存のアイテムのリストボックスがあります。

  2. フリーフォームのテキスト入力が可能なテキストボックスがあります

  3. 接頭辞の値が現在のテキスト ボックスのエントリと一致するアイテムは、リストボックスのアイテムがフィルター処理され、一致するアイテムに制限されます。

  4. 現在のテキスト ボックス エントリがリストボックスのフィルタリングに一致するプレフィックスを提示している場合でも、ユーザーは自由形式のテキスト エントリを実行できます。したがって、ここでは 2 つのケースが考えられます

    4.1 ユーザーがリスト ボックスをクリックして、フィルタリングされた項目の 1 つを選択する

    4.2 ユーザーが Enter キーを押すと、テキスト ボックスの現在の値が選択されます。

ただし、ウィジェットが競合状態に参加しているため、ウィジェットをクリックすると、SelectionHandler ではなく ValueChangeHandler がトリガーされます。あなたのウィジェットの構造がわからないので、それが私の最善の推測です。

問題は、結果を取得する 2 つの別々のモードを許可していて、適切なモードの選択を処理するための適切に定義されたステート マシンがおそらくないことです。1 つのモードはテキスト ボックスによるもので、もう 1 つはリスト ボックスでの選択によるものです。どのモードがいつ有効になるかについて明確に定義された方法はありません。

私の推測が正しければ、これはあなたがする必要があることです:

  • 結果がテキストボックスのみから来るように制限する必要があります。

  • リストボックスの選択によって結果がトリガーされてはなりません。リストボックスの選択の変更はすべて、テキストボックスに伝播する必要があります。これにより、ユーザーはその値に基づいてさらに自由な入力を行うことができます。

  • テキストボックスにキーボードで入力するだけで、最終的な結果がトリガーされます。

于 2012-03-12T00:21:02.837 に答える