ICEfaces(JSF)3.3.0 SelectInputText Enter Key不从列表中选择Item

时间:2018-02-27 09:52:47

标签: jsf autocomplete icefaces

我遇到了ICEfaces 3.3.0 SelectInputText。

的一些问题

以下情景:

方案1:

  1. 在条目
  2. 中输入“d”
  3. 我得到了SelecItems的列表。 (假,虚拟2 ......)
  4. 现在当我用鼠标左键单击选择“Dummy”时,aissigned to selectInputText.value的值设置为Dummy(预期行为)
  5. 方案2:

    1. 在条目
    2. 中输入“d”
    3. 我得到了SelecItems的列表。 (假,虚拟2 ......)
    4. 现在当我通过滚动courser-key选择“Dummy”并按Enter键时,我将值设置为“d”而不是Dummy。?
    5. 方案3:

      1. 在条目
      2. 中输入“d”
      3. 我得到了SelecItems的列表。 (假,虚拟2 ......)
      4. 现在当我通过滚动courser-key选择“Dummy”并按 Ctrl + Enter键时,我将值设置为“Dummy”。预期的行为。
      5. 我还在selectInputText.actionListener中添加了一个actionListener来查看发生了什么:

        方案2 的情况下,actionListener调用两次:检查第一个actionListener中的值包含“d”,第二个调用包含“Dummy”

        我知道当你没有从下拉列表中选择任何东西并按下Enter键时,该值被设置为selectInputText中输入的文本,这也是一个预期的行为并且是记录在案的,但在我的案例方案2 为什么actionListener调用了两次?也就是说,在第一次通话时按Enter键不会选择项目?

        这是一个Bug还是我错过了什么?

        提前致谢!

        以下是代码:

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

1 个答案:

答案 0 :(得分:1)

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

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

您可以通过googleing&#34; JSF生命周期&#34;

阅读更多关于生命周期的内容

针对您的特殊问题&#34;你必须检查正确的阶段并设置值(把它放在你的监听器方法的beginnig):

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