【问题标题】:How to make p:selectOneMenu show current value?如何使 p:selectOneMenu 显示当前值?
【发布时间】:2012-12-13 21:13:03
【问题描述】:

我有一个<p:selectOneMenu> 可以从中选择项目的类别。默认情况下,菜单显示选中的someBean.selectedParty.categories 的第一个条目。但是该项目已经在someBean.selectedItem.category 有一个我想要显示/选择的当前类别。我怎样才能做到这一点?

<p:selectOneMenu value="#{someBean.selectedItem.category}" converter="omnifaces.SelectItemsConverter">
    <f:selectItems value="#{someBean.selectedParty.categories}" var="category" itemLabel="#{category.name}"/>   
</p:selectOneMenu>

【问题讨论】:

  • 你的意思是在页面加载时,someBean.selectedItem.category 有一个默认值?还是选择后,当前值没有更新?
  • 第一个是正确的:之前选择了Item,它的其他属性都可以显示。但是对于类别,我想在包含所有可用类别的下拉菜单中显示当前值,并使用户能够将类别更改为当前类别。
  • 对不起,如果这听起来很生硬,但我真的完全不知道你具体遇到了什么问题。到目前为止给出的代码绝对应该将#{someBean.selectedItem.category} 显示为当前选定的项目(如果它已被预设)。 SSCCE 和用例可能有助于理解您的具体问题。
  • @BalusC 感谢您推动我找到解决方案。在创建 SSCCE 时,我突然想到,在我的设置中,我必须再次覆盖 hashCode() 和 equals(),因为否则由于不同的哈希码,所选类别及其在列表中的对应项将不会被识别为相同。

标签: jsf-2 primefaces


【解决方案1】:

只要 someBean.selectedItem.category 的 getter 返回列表中可用的值,它就会显示该值为选中状态。

但是有一些问题:
1)默认值可能应该在bean构造函数中设置

2) bean (someBean) 不能有 RequestScope - 因为每一个 HTTP 请求,包括 Ajax 请求,都会创建一个全新的 bean 实例,所有属性都设置为默认值。如果你的 bean 是 RequestScope,则改为 ViewScope

3) 当您从 someBean 到 selectedItem 再到 category 时,请注意 selectedItem 和 selectedParty 必须相同(不仅内容相同,而且内存地址相同),否则 JSF 的生命周期将停止。我猜您之前正在设置选定的对象。如果您使用 AJAX,请尝试使用下拉菜单向新页面发布“完整”请求以进行调试。

4) 为了简化这一点,您可以尝试将类别和类别直接移动到 someBean 中,这样页面应该看起来像

<p:selectOneMenu value="#{someBean.category}" converter="omnifaces.SelectItemsConverter">
    <f:selectItems value="#{someBean.categories}" var="category" itemLabel="#category.name}"/>    
</p:selectOneMenu>

【讨论】:

  • 谢谢,直到我创建了一个像 BalusC 在他对我的问题的评论中提出的 SSCCE 时我才意识到,但我想你列表中的第 3 点很好地描述了我遇到的问题(另见我的第 2评论我的问题)。
猜你喜欢
  • 2013-08-27
  • 2020-04-20
  • 2016-09-18
  • 1970-01-01
  • 2014-05-12
  • 2016-04-09
  • 2019-02-18
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多