<h:selectonemenu>临时禁用SelectItems </h:selectonemenu>

时间:2011-02-15 18:48:43

标签: jsf

我有一个<h:selectOneMenu>,它从我的对象模型中呈现cardStatus的值。 CardStatus有一个布尔属性'temporaryDisabled',表示该值仍然有效,但不应由用户使用。

现在,如果我的模型将cardStatus设置为临时禁用值,如何在下拉组合框中显示此值并仍然阻止用户将值更改为另一个临时禁用状态?

如果我只是从我提供给<h:selectOneMenu>的SelectItems列表中删除已禁用的卡状态,那么当选择被渲染时,它会自动选择列表中的第一个项目,然后下次提交,从而错误地更改我的模型中的价值。

如果我在SelectItems列表中包含已禁用的卡状态,但是对于相应的项目将disabled属性的值设置为true,则它们将在HTML中呈现为禁用且未提交,因此我在模型中获取空值,即也错了。

我被困住了。任何建议都表示赞赏。

祝你好运, 丹。

4 个答案:

答案 0 :(得分:1)

最后我做的是使用一段在加载页面后执行的jQuery代码。

<h:selectOneMenu 
    id="cardStatus" 
    value="#{someBean.cardStatus}"
    converter="selectItemConverter">
    <f:selectItem itemValue="E|A" itemLabel="Active" />
    <f:selectItem itemValue="E|S" itemLabel="Stolen" />
    <f:selectItem itemValue="D|B" itemLabel="Blocked" />
    <f:selectItem itemValue="E|L" itemLabel="Lost" />
    <f:selectItem itemValue="D|C" itemLabel="Counterfeit" />
</h:selectOneMenu>

javascript代码的作用是扫描所有项目,并为每个项目添加一个以前缀 D | 开头的值,使用jQuery的hide()函数隐藏该项目。这样组合框的作用就是所有值都有效/启用,但用户将无法选择非活动值,因为它们不可见。此外,如果默认选择的值是以 D | 开头的值之一,则该值仍将显示为默认值,但用户无法在选项列表中看到它/他可以选择。

答案 1 :(得分:0)

  

“这意味着该值仍然有效,但不应由用户使用”

帮助我理解这篇文章。您想在h:selectOneMenu中显示这些选项但不允许用户选择它们吗?我想我不明白为什么如果他们是无效的选项,你会把它们呈现给用户?

你可以随时创建一个验证“temporaryDisabled”的验证器,如果那是你想要完成的...让我更多地了解你希望最终用户看到什么,我可能会帮助你。

答案 2 :(得分:0)

<h:selectOneMenu 
    id="cardStatus" 
    value="#{someBean.cardStatus}"
    converter="selectItemConverter">
    <f:selectItem itemValue="#{null}" itemLabel="" />
    <f:selectItems  
        value="#{cardStatusBean.cardStatuses}"
        var="cardStatus"
        itemValue="#{cardStatus}"
        itemLabel="#{cardStatus.name}"
        itemDisabled="#{cardStatus.temporaryDisabled}"/>    
</h:selectOneMenu>

这将为您提供值为null和空标签的默认选项。这会实现你想要的吗?

答案 3 :(得分:0)

对于记录,如果使用JSF 2.0,则f:selectItem和f:selectItems具有“itemDisabled”属性,可生成所需的行为。