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

时间:2013-01-01 13:11:43

标签: jsf-2 primefaces facelets selected selectonemenu

添加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";
}

结果:

enter image description here

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

这是如何引起的?如何解决?

1 个答案:

答案 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}},可以解决您的问题。