ICEfaces(JSF)3.3.0 SelectInputText Enter键不会从列表中选择项目
我对ICEfaces 3.3.0 SelectInputText有一些问题 以下场景: 情景1: 在条目中键入d 我得到了自己的名单。笨蛋,笨蛋2。。。 现在,当我用鼠标左键单击它来选择Dummy时,指定为selectInputText.value的值被设置为Dummy expected behavior 情景2: 在条目中键入d 我得到了自己的名单。笨蛋,笨蛋2。。。 现在,当我用courser键滚动选择Dummy并按Enter键时,我得到的值设置为d而不是Dummy。? 情景3: 在条目中键入d 我得到了自己的名单。笨蛋,笨蛋2。。。 现在,当我使用courser键滚动选择Dummy并按下Ctrl+Enter键时,我将该值设置为Dummy。预期的行为。 我还将actionListener添加到selectInputText.actionListener以查看发生了什么: 在场景2中,actionListener调用了两次:检查第一个actionListener中的值是否包含d,接下来的第二个调用是否包含Dummy 我知道当您不从下拉列表中选择任何内容并按Enter键时,该值将设置为selectInputText中输入的文本,这也是一种预期行为,如文档所示,但在我的情况下是场景2 为什么actionListener调用了两次?也就是说,在第一次调用时按Enter键不会选择该项目 这是一只虫子还是我错过了什么 提前谢谢 代码如下:ICEfaces(JSF)3.3.0 SelectInputText Enter键不会从列表中选择项目,jsf,autocomplete,icefaces,Jsf,Autocomplete,Icefaces,我对ICEfaces 3.3.0 SelectInputText有一些问题 以下场景: 情景1: 在条目中键入d 我得到了自己的名单。笨蛋,笨蛋2。。。 现在,当我用鼠标左键单击它来选择Dummy时,指定为selectInputText.value的值被设置为Dummy expected behavior 情景2: 在条目中键入d 我得到了自己的名单。笨蛋,笨蛋2。。。 现在,当我用courser键滚动选择Dummy并按Enter键时,我得到的值设置为d而不是Dummy。? 情景3: 在条目中键
<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生命周期和事件的处理方式。听众总是被呼叫两次 考虑到您正在侦听器中使用此代码,它的执行是由事件触发的。事件有一个阶段,告诉框架您希望在生命周期的哪个部分处理它们 通过谷歌搜索JSF生命周期,您可以了解更多关于生命周期的信息 对于您的特殊问题,您必须检查正确的相位并设置值,将其放在侦听器方法的开头:
if (!event.getPhaseId().equals(PhaseId.INVOKE_APPLICATION)) {
event.setPhaseId(PhaseId.INVOKE_APPLICATION);
event.queue();
return true;
}
谢谢你提供的信息,但这没有多大帮助。我正在line event.setPhaseId上设置断点,但断点从未在此断点处停止。在我发表第一篇文章之前,我已经玩过PhaseId,但它总是调用应用程序。你的评论是一个很好的提示。2次呼叫。我刚刚重新实现了我的代码,现在我得到了我想要的。谢谢