2

我是 GWT 的新手。我有一个使用MultiWordSuggestOracle填充的简单SuggestBox。用户将他们的数据输入到这个 SuggestBox 中,如果他们发现任何与现有 Suggestions 匹配的内容,那就太好了。我可以在 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
        }
    });

但是允许用户输入建议 oracle 中尚不存在的值,在这种情况下,我应该读取该值并对此进行处理,可能会将其作为新数据保存到 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);

        }
    });

除了一种情况外,这工作正常。假设 oracle 中有两个建议,比如“createTicketWsdl”和“createTicketTimeout”。当用户输入“cr”时,他选择了这两个选项,如果他通过按键盘 ENTER选择“createTicketWsdl” ,那么我的警报将打印“createTicketWsdl”,这是正确的。但是,如果他使用鼠标选择“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. 即使当前文本框条目提供匹配的前缀来过滤列表框,用户仍然可以执行自由格式的文本输入。所以,这里有两种可能的情况

    4.1 用户点击列表框,选择其中一个被过滤的项目

    4.2 用户按下回车键,触发选择文本框的当前值。

但是,您会发现您的小部件参与了竞争条件,因此当您单击小部件时,会触发 ValueChangeHandler 而不是 SelectionHandler。我不知道你的小部件的结构,所以这是我最好的猜测。

问题是您允许两种不同的模式来获得结果,并且您可能没有明确定义的状态机来处理选择适当的模式。一种模式是通过文本框,另一种是通过列表框上的选择 - 而且您没有明确定义的方式,模式在任何时候都有效。

如果我的猜测是准确的,这就是你需要做的:

  • 您必须将结果限制为仅来自文本框。

  • 您的列表框选择不得触发任何结果。列表框选择中的任何更改都必须传播回文本框 - 以允许用户根据该值进行进一步的自由输入。

  • 只有文本框上的键盘输入才会触发最终结果。

于 2012-03-12T00:21:02.837 回答