ICEfaces (JSF) 3.3.0 SelectInputText Enter Key 不 select 列表中的项目

ICEfaces (JSF) 3.3.0 SelectInputText Enter Key doesn't select the Item from the list

我在使用 ICEfaces 3.3.0 SelectInputText 时遇到一些问题。

以下场景:

场景一:

  1. 在条目
  2. 中键入 "d"
  3. 我得到了 SelecItems 的列表。 (假人,dummy2 ...)
  4. 现在当我 select "Dummy" 用鼠标左键单击它时,分配给 selectInputText.value 的值被设置为虚拟(预期行为)

场景二:

  1. 在条目
  2. 中输入 "d"
  3. 我得到了 SelecItems 的列表。 (假人,dummy2 ...)
  4. 现在,当我 select "Dummy" 通过使用 courser 键滚动并按 Enter 键时,我将值设置为 "d" 而不是 Dummy。?

场景三:

  1. 在条目
  2. 中键入 "d"
  3. 我得到了 SelecItems 的列表。 (假人,dummy2 ...)
  4. 现在,当我 select "Dummy" 通过使用 courser 键滚动并按下 Ctrl + Enter 键 时,我将值设置为"Dummy"。预期行为。

我还向 selectInputText.actionListener 添加了一个 actionListener 以查看发生了什么:

场景 2 中,actionListener 调用了两次:检查第一个 actionListener 中的值包含 "d",随后的第二个调用包含 "Dummy"

我知道当您不select下拉列表中的任何内容并按下 Enter 键时,该值将设置为在 selectInputText 中输入的文本,这也是预期的行为并且已记录在案,但就我而言 场景 2 为什么 actionListener 调用了两次?也就是说,该项目不是在第一次调用时按回车键 selected 吗?

这是一个错误还是我遗漏了什么?

提前致谢!

代码如下:

                    <ice:selectInputText

                        value="#{controller.selectedText}"
                        actionListener="#{controller.doSubmitText}"
                        textChangeListener="#{controller.textChangedEvent}"
                        rows="0" 
                        width="300"
                        listVar="person"
                        listValue="#{controller.persons}"> 
                        <f:facet name="selectInputText">
                            <h:panelGrid id="f"
                                columns="2" width="100%"
                                columnClasses="col75,col25">
                                <ice:outputLabel value="#{person.name}"/>
                                <ice:outputLabel value="#{person.username}"/>
                            </h:panelGrid>
                        </f:facet>
                    </ice:selectInputText>

这里是 Bean 的相关部分 (scope=session)

private List<SelectItem> persons;
public List<SelectItem> getPersons() {
    return persons;
}

public void setPersons(List<SelectItem> persons) {
    this.persons= persons;
}

private String selectedText = null;

public String getSelectedText() {
    return selectedText;
}

public void setSelectedText(String selectedText) {
    this.selectedText = selectedText;
}

public void textChangedEvent(TextChangeEvent ev) {
    personlist = getfilteredList(ev.getNewValue().toString());
}

public void doSubmitText(ActionEvent event) {
    System.out.println(selectedText);
}   

场景 2 行为的原因是 IceFaces 生命周期和事件的处理方式。听众总是被叫两次。

考虑到您在侦听器中使用此代码,它的执行是由事件触发的。事件有一个阶段,它告诉框架您希望在生命周期的哪个部分处理它们

您可以通过 google "JSF lifecycle"

阅读更多关于生命周期的信息

对于您的特殊 "problem",您必须检查正确的相位并设置值(将其放在侦听器方法的开头):

if (!event.getPhaseId().equals(PhaseId.INVOKE_APPLICATION)) {
        event.setPhaseId(PhaseId.INVOKE_APPLICATION);
        event.queue();
        return true;
    }