【问题标题】:<h:selectOneMenu> with temporary disabled SelectItems<h:selectOneMenu> 暂时禁用 SelectItems
【发布时间】:2011-02-15 18:48:43
【问题描述】:

我有一个&lt;h:selectOneMenu&gt;,它从我的对象模型中呈现 cardStatus 的值。 CardStatus 有一个布尔属性“temporaryDisabled”,这意味着该值仍然有效,但不应由用户使用。

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

如果我只是从我提供给&lt;h:selectOneMenu&gt; 的 SelectItems 列表中删除禁用的卡状态,那么当呈现选择时,它将自动选择列表中的第一个项目并在下次提交时错误地更改我的值模型。

如果我在 SelectItems 列表中包含禁用的卡片状态,但将其相应项目的 disabled 属性的值设置为 true,它们会以 HTML 禁用且未提交,因此我在模型中得到一个空值,即也错了。

我被困住了。任何建议都非常感谢。

最好的问候, 丹。

【问题讨论】:

    标签: jsf


    【解决方案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| 开头的值之一,该值仍将显示为默认值,但用户无法在他/她的选项列表中看到它可以选择。

    【讨论】:

      【解决方案2】:

      “表示该值仍然有效,但不应被用户使用”

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

      如果这是您想要完成的任务,您始终可以创建一个针对“temporaryDisabled”进行验证的验证器......让我了解更多关于您希望最终用户看到的内容,我可能会提供帮助。

      【讨论】:

      • 他想让某些项目无法选择。
      • 这个想法是我想要一个行为稍有修改的组合框。组合框的默认行为是让用户从项目列表中进行选择,如果最初没有选择&lt;option&gt;,则显示列表中的第一个项目。我的意图是有一个组合框,它可以最初显示不在&lt;option&gt;s 列表中的项目(或以某种方式隐藏/不可见)并提交此值,只要用户不选择另一个选项。
      【解决方案3】:
      <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 和一个空标签的默认选择。这会实现您想要的吗?

      【讨论】:

      • 不幸的是,这不是我想要的。实际上,我希望有可能将禁用项目之一作为默认值,并在提交时将此值发送到服务器并填充到我的模型中(以防万一用户没有触摸组合框)。
      • 你能把你想提交的值添加为f:selectItem吗? ?这样,如果未触摸 selectOneMenu,则该值将是提交的值。
      【解决方案4】:

      作为记录,如果使用 JSF 2.0,f:selectItem 和 f:selectItems 有一个“itemDisabled”属性,可以产生所需的行为。

      【讨论】:

        猜你喜欢
        • 2012-12-25
        • 2014-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多