我遇到了ICEfaces 3.3.0 SelectInputText。
的一些问题以下情景:
方案1:
方案2:
方案3:
我还在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);
}
答案 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;
}