当选择框中包含“无选择选项”时,p:selectOneMenu会预先选择前一个选项。

5

当添加 f:selectItem 时,p:selectOneMenu 的选择存在问题。

视图:

<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个回答

7
我可以重现您的问题。我查看了PrimeFaces源代码。这是在使用noSelectionOption="true"项目时在PrimeFaces SelectOneMenuRenderer中暴露出来的一个bug。对于此,渲染器不会为支持<select>元素的HTML<option>元素生成内容, 但它将为视觉<ul>列表的<li>生成内容。换句话说,在您的情况下,<select>包含4个项目,而 <ul>包含5个项目。正如您所怀疑的那样,JavaScript根据<option selected>的索引选择<li>。这解释了您的问题。
您最好向PrimeFaces团队报告此问题。渲染器也应该为此生成<option>元素,或者JavaScript应该基于值而不是索引选择选项。
同时,将noSelectionOption="true"替换为itemValue="#{null}"或者在JSF配置为空字符串提交值时解释为null时,也可以解决您的问题。请保留HTML标签。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接