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 时遇到一些问题。
以下场景:
场景一:
- 在条目
中键入 "d"
- 我得到了 SelecItems 的列表。 (假人,dummy2 ...)
- 现在当我 select "Dummy" 用鼠标左键单击它时,分配给 selectInputText.value 的值被设置为虚拟(预期行为)
场景二:
- 在条目
中输入 "d"
- 我得到了 SelecItems 的列表。 (假人,dummy2 ...)
- 现在,当我 select "Dummy" 通过使用 courser 键滚动并按 Enter 键时,我将值设置为 "d" 而不是 Dummy。?
场景三:
- 在条目
中键入 "d"
- 我得到了 SelecItems 的列表。 (假人,dummy2 ...)
- 现在,当我 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;
}
我在使用 ICEfaces 3.3.0 SelectInputText 时遇到一些问题。
以下场景:
场景一:
- 在条目 中键入 "d"
- 我得到了 SelecItems 的列表。 (假人,dummy2 ...)
- 现在当我 select "Dummy" 用鼠标左键单击它时,分配给 selectInputText.value 的值被设置为虚拟(预期行为)
场景二:
- 在条目 中输入 "d"
- 我得到了 SelecItems 的列表。 (假人,dummy2 ...)
- 现在,当我 select "Dummy" 通过使用 courser 键滚动并按 Enter 键时,我将值设置为 "d" 而不是 Dummy。?
场景三:
- 在条目 中键入 "d"
- 我得到了 SelecItems 的列表。 (假人,dummy2 ...)
- 现在,当我 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;
}