5

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 根据其在列表中的索引而不是项目的值来选择项目。

这是如何引起的,我该如何解决?

4

1 回答 1

7

我可以重现你的问题。我查看了 PrimeFaces 源代码。这是 PrimeFacesSelectOneMenuRenderer中的一个错误,仅在使用带有的项目时才会暴露noSelectionOption="true"。渲染器不会为此生成<option>支持<select>元素的 HTML 元素,但会为此生成<li>视觉<ul>列表的 。换句话说,<select>在您的案例中包含 4 个项目和<ul>5 个项目。<li>由 JavaScript 根据 的索引选择,<option selected>正如您所怀疑的那样。这解释了你的问题。

最好的办法是将其作为错误报告给 PrimeFaces 人员。渲染器还应该<option>为此生成,或者 JavaScript 应该根据值而不是索引来选择选项。

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

于 2013-01-02T00:32:40.310 回答