p:selectOneMenu 在 noSelectionOption 项不存在时预选上一项

2023-12-01

有一个问题p:selectOneMenu添加时的选择f:selectItem.

View:

<p:selectOneMenu value="#{selectionTest.selectedName}">
    <f:selectItem itemLabel="Select" noSelectionOption="true" />
    <f:selectItems value="#{selectionTest.allNames}" var="varName" itemLabel="#{varName}" itemValue="#{varName}" />
</p:selectOneMenu>

Model:

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

Result:

enter image description here

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

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


我可以重现你的问题。我查看了 PrimeFaces 源代码。这是 PrimeFaces 中的一个错误SelectOneMenuRenderer仅当项目具有noSelectionOption="true"已被使用。渲染器不会生成 HTML<option>背衬元素<select>元素,但它会生成<li>视觉的<ul>列出这个。换句话说,<select>您的箱子中包含 4 件物品,并且<ul>5 项。这<li>由 JavaScript 根据索引进行选择<option selected>,正如你所怀疑的那样。这解释了你的问题。

你最好的选择是将其报告为错误致 PrimeFaces 的朋友们。渲染器还应该生成<option>为此,或者 JavaScript 应该根据值而不是索引来选择选项。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

p:selectOneMenu 在 noSelectionOption 项不存在时预选上一项 的相关文章

随机推荐