【问题标题】:p:selectOneMenu preselects previous item when noSelectionOption item is presentp:selectOneMenu 在 noSelectionOption 项目存在时预选前一个项目
【发布时间】:2012-12-16 03:40:58
【问题描述】:

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

结果:

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

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

【问题讨论】:

    标签: jsf-2 primefaces facelets selected selectonemenu


    【解决方案1】:

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

    您最好的选择是 report it as a bug 给 PrimeFaces 人。渲染器还应该为此生成 &lt;option&gt;,或者 JavaScript 应该根据值而不是索引来选择选项。

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

    【讨论】:

    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2016-11-25
    • 1970-01-01
    相关资源
    最近更新 更多