2010-06-03 13 views
4

Quelqu'un peut-il me dire comment régler automatiquement <h:selectOneMenu> (ou tout autre composant) avec des valeurs dépendant d'un autre <h:selectOneMenu> s'il y a des éléments vides avec 'required' réglé sur 'vrai' sur le formulaire? Si vous définissez <a4j:support event="onchange" reRender="anotherElement" immediate="true" /> alors rien n'est changé car la valeur modifiée n'est pas définie. Mais sans immediate="true" j'ai toujours le message que tel ou tel élément ne peut pas être vide. Voici un exemple de code qui ne fonctionne pas.Comment définir une liste déroulante avec des valeurs dépendant d'une autre liste déroulante si les deux sont réglés sur requis

<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> 

Donc, ici (je le répète), si j'essaie de changer « someSelect » puis « anotherSelect » devrait mettre à jour ses valeurs, mais elle ne présente pas parce que quand celui-ci tente d'obtenir la valeur de « someSelect » il obtient null (si immediate est défini sur true) ou la validation de formulaire échoue sur les éléments vides. Comment puis-je ignorer la validation mais obtenir cette valeur modifiée de 'someSelect'?

Répondre

2

Avez-vous essayé d'ajouter ajaxSingle="true" à l'élément someSelect a4j: support? Retirez le immediate="true"

+0

Ouais, merci! C'est si simple :) – mykola

0

La solution suivante fonctionne dans 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> 

Le f: appel ajax soumettra une demande ajax au serveur onchange de "someSelect". La mise à jour du modèle uniquement pour le composant "someSelect" aura lieu (à cause de execute = "@ this"). Dans la phase de réponse de rendu, seul "anotherSelect" sera rendu de nouveau (invoquant ainsi testController.stateNamesSelectItems avec le nom de pays mis à jour). À la suite de tout cela, les états du pays sélectionné seront mis à jour en tant que quand le pays est changé ... la manière ajax.

Espérons que cela aide.

+0

Merci, mais j'utilise jsf 1.2. :) – mykola