添加p:selectOneMenu
时,f:selectItem
选择存在问题。
查看:
<p:selectOneMenu value="#{selectionTest.selectedName}">
<f:selectItem itemLabel="Select" noSelectionOption="true" />
<f:selectItems value="#{selectionTest.allNames}" var="varName" itemLabel="#{varName}" itemValue="#{varName}" />
</p:selectOneMenu>
型号:
private List<String> allNames;
private String selectedName;
public MenuSelectionTestBean(){
allNames = new ArrayList<String>();
allNames.add("Ahmed");
allNames.add("Mohamed");
allNames.add("Ibrahim");
allNames.add("Walid");
selectedName ="Walid";
}
结果:
应该选择“Walid”项,但是选择“Ibrahim”。我认为PrimeFaces根据列表中的索引选择项目,而不是项目的值。
这是如何引起的?如何解决?
答案 0 :(得分:7)
我可以重现你的问题。我查看了PrimeFaces的源代码。这是PrimeFaces SelectOneMenuRenderer
中的一个错误,只有在使用noSelectionOption="true"
的项目时才会公开。渲染器不会为其生成支持<option>
元素的HTML <select>
元素,但会为此生成视觉<li>
列表的<ul>
。换句话说,<select>
包含4个项目和<ul>
5个项目。 JavaScript <li>
基于<option selected>
的索引选择<option>
,与您怀疑的完全相同。这解释了你的问题。
你最好的选择是report it as a bug给PrimeFaces的家伙。渲染器也应为此生成noSelectionOption="true"
,否则JavaScript应根据值而不是索引选择选项。
同时,当JSF配置为将空字符串提交值解释为itemValue="#{null}"
时,将itemValue=""
替换为null
或{{1}},可以解决您的问题。