p:当noSelectionOption项存在时,selectOneMenu预选前一项

eha*_*aat 5 facelets selected selectonemenu primefaces jsf-2

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>
Run Code Online (Sandbox Code Playgroud)

模型:

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";
}
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

应选择"Walid"项,但选择"Ibrahim".我认为PrimeFaces根据列表中的索引选择项目,而不是项目的值.

这是怎么造成的,我该如何解决?

Bal*_*usC 7

我可以重现你的问题.我查看了PrimeFaces的源代码.这是PrimeFaces中的一个错误,SelectOneMenuRenderer只有在使用了某个项目时才会公开noSelectionOption="true".渲染器不会为其生成<option>支持<select>元素的HTML 元素,但会为其生成<li>可视<ul>列表.换句话说,<select>在你的情况下包含4项和<ul>5项.它<li>是由JavaScript根据<option selected>您所怀疑的索引选择的.这解释了你的问题.

你最好的办法是将它作为一个错误报告给PrimeFaces的人.渲染器也应生成<option>for,或JavaScript应根据值而不是索引选择选项.

同时,替换noSelectionOption="true"by itemValue="#{null}",或者itemValue=""当JSF配置为将空字符串提交值解释为时null,应该可以解决您的问题.