【问题标题】:How to set dropdown with values depending on another dropdown if both are set to required如果两者都设置为必需,如何根据另一个下拉列表设置值的下拉列表
【发布时间】:2011-02-27 09:04:09
【问题描述】:

如果表单上有“required”设置为“true”的空元素,谁能告诉我如何自动设置<h:selectOneMenu>(或任何其他组件)的值取决于另一个<h:selectOneMenu>?如果设置<a4j:support event="onchange" reRender="anotherElement" immediate="true" />,则不会更改任何内容,因为未设置更改的值。但是如果没有immediate="true",我总是有消息说这个或那个元素不能为空。这是不起作用的代码示例。

<h:outputLabel value="* #{msg.someField}: "/>
<h:panelGrid cellpadding="0" cellspacing="0">
    <h:selectOneMenu id="someSelect"
            value="#{MyBean.someObj.someId}"
            required="true" label="#{msg.someField}"
            >
        <a4j:support event="onchange" reRender="anotherSelect" limitToList="true" immediate="true"/>
        <f:selectItem itemValue=""/>
        <f:selectItems value="#{MyBean.someList}"/>
    </h:selectOneMenu>
    <rich:message for="someSelect" styleClass="redOne"/>
</h:panelGrid>

<h:outputLabel value="* #{msg.anotherField}: "/>
<h:panelGrid cellpadding="0" cellspacing="0">
    <h:selectOneMenu id="anotherSelect"
            value="#{MyBean.someObj.anotherId}"
            required="true" label="#{msg.anotherField}"
            >
        <f:selectItem itemValue=""/>
        <f:selectItems value="#{MyBean.anotherList}"/>
    </h:selectOneMenu>
    <rich:message for="anotherSelect" styleClass="redOne"/>
</h:panelGrid>

<h:outputLabel value="* #{msg.name}: "/>
<h:panelGrid cellpadding="0" cellspacing="0">
    <h:inputText id="myName" value="#{MyBean.someObj.myName}" 
            required="true" label="#{msg.name}"/>
    <rich:message for="myName" styleClass="redOne"/>
</h:panelGrid>

所以,在这里(我重复一遍),如果我尝试更改“someSelect”,那么“anotherSelect”应该更新它的值,但它不会因为当它尝试获取“someSelect”的值时它会变为空(如果@ 987654326@ 设置为 true) 或表单验证在空元素上失败。如何跳过验证但从“someSelect”获取更改后的值?

【问题讨论】:

    标签: validation jsf selectonemenu ajax-update


    【解决方案1】:

    您是否尝试将ajaxSingle="true" 添加到 someSelect a4j:support 元素?删除immediate="true"

    【讨论】:

      【解决方案2】:

      以下解决方案适用于 JSF 2.0

      <h:outputLabel
          value="* Country: "/>
      <h:selectOneMenu
          id="someSelect"
          value="#{testController.countryName}"
          required="true">
          <f:selectItem
              itemLabel="Select Country"
              itemValue=""/>
          <f:selectItems
              value="#{testController.countryNamesSelectItems}"/>
          <!-- This will only update "someSelect" and repaint "anotherSelect" -->
          <f:ajax
              execute="@this"
              render="anotherSelect"/>
      </h:selectOneMenu>
      
      <h:outputLabel
          value="* State: "/>
      <h:selectOneMenu
          id="anotherSelect"
          value="#{testController.stateName}"
          required="true">
          <f:selectItem
              itemLabel="Select State"
              itemValue=""/>
          <f:selectItems
              value="#{testController.stateNamesSelectItems}"/>
      </h:selectOneMenu>
      

      f:ajax 调用将在“someSelect”的更改时向服务器提交一个 ajax 请求。只有“someSelect”组件的模型更新才会发生(因为 execute="@this")。在渲染响应阶段,只会重新渲染“anotherSelect”(因此会使用更新的国家名称调用 testController.stateNamesSelectItems)。

      由于所有这些,所选国家/地区的状态将随着国家/地区的更改而更新……ajax方式。

      希望这会有所帮助。

      【讨论】:

      • 谢谢,但我使用的是 jsf 1.2。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多