Получение текущего введенного пользователем значения из GWT SuggestBox - PullRequest
2 голосов
/ 12 марта 2012

Я новичок в GWT.У меня есть простой SuggestBox , который заполняется с помощью MultiWordSuggestOracle .Пользователи вводят свои данные в этот 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
        }
    });

Но пользователям разрешено вводить значения, которых еще нет в оракуле предложения, и в этом случае я должен прочитать это значение и сделатьчто-то с этим, может быть сохранение в БД в качестве новых данных. (То, что я ищу, это что-то вроде виджета навигации браузера, где мы показываем предложения, пользователи могут выбрать любое предложение, или он может ввести свою новую запись ипродолжить.) Что мне нужно, это способ восстановить этот новый текст, введенный пользователем?Данные будут прочитаны по нажатию кнопки.Я попробовал вот что.

    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);

        }
    });

Это работает нормально, за исключением одного сценария.Предположим, в оракуле есть два предложения: createTicketWsdl и createTicketTimeout.Когда пользователь вводит 'cr' , он выбирает эти две опции, и если он выбирает 'createTicketWsdl' , нажимая клавиатуру ENTER , то мое предупреждение печатает 'createTicketWsdl', которыйверно.Но если он выбирает «createTicketWsdl» с помощью мыши , то мое предупреждение печатает 'cr' (я пытался опубликовать скриншот, чтобы лучше понять, но, будучи новым пользователем, я 'я не могу). (который я хотел получить как 'createTicketWsdl', вот что он выбрал).Вскоре после печати моего предупреждения значение в SuggestBox изменится на 'createTicketWsdl'.

Есть ли способ получить значение окна предложения?Я видел похожую тему GWT SuggestBox + ListBox Widget , где доступен некоторый исходный код для пользовательского виджета.Но я не взял на себя труд испытать это, так как мне нужно просто получить текущее значение из SuggestBox, и я надеюсь, что должен быть какой-то простой способ.

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 12 марта 2012

Ваш вопрос не очень понятен. Вам нужно немного уточнить свой язык. Например - следующий вопрос или утверждение? Я имею в виду, это звучит как утверждение, но у него есть вопросительный знак.

Что мне нужно, это способ восстановить введенный пользователем новый текст?

Кроме того, я не понимаю, что вы подразумеваете под "he is opted by". Вы хотели сказать "he is presented with the options ..."?

Поэтому я угадываю вашу ситуацию.

  1. У вас есть список существующих предметов.

  2. У вас есть текстовое поле, позволяющее вводить текст произвольной формы

  3. Любые элементы, значения префикса которых соответствуют текущей записи текстового поля, элементы списка будут отфильтрованы, чтобы ограничиться соответствующими элементами.

  4. Даже если текущая запись в текстовом поле представляет соответствующие префиксы для фильтрации списка, пользователь все равно может выполнять ввод текста произвольной формы. Итак, здесь есть два возможных случая

    4.1 пользователь нажимает на поле со списком, чтобы выбрать один из отфильтрованных элементов

    4.2 пользователь нажимает клавишу ввода, которая запускает выбор текущего значения текстового поля.

Однако вы видите, что ваш виджет участвует в состоянии гонки, поэтому при нажатии на виджет запускается ValueChangeHandler, а не SelectionHandler. Я не знаю структуру вашего виджета, так что это мое лучшее предположение.

Проблема в том, что вы разрешаете два отдельных способа получения результата, и у вас, вероятно, не было четко определенного конечного автомата, чтобы справиться с выбором подходящего режима. Один режим - с помощью текстового поля, а другой - путем выбора в списке - и у вас нет четко определенного способа, которым этот режим был бы эффективен в любой момент.

Если мое предположение верно, это то, что вам нужно сделать:

  • Вы должны ограничить свой исход только из текстового поля.

  • Ваш выбор списка не должен вызывать никакого результата. Любое изменение в выборе списка должно распространяться обратно в текстовое поле, чтобы дать пользователю возможность сделать дополнительную запись произвольной формы на основе этого значения.

  • только клавиатура, введенная в текстовое поле, будет запускать окончательный результат.

...