Primefaces dépendante selectOneMenu et required=“true”

Dans mon application j'ai trois menu déroulant (p:selectOneMenu), disons A, B, C. Parmi eux, deux sont dépendants, dire B et C. En changeant la valeur de B je suis le chargement dynamique de valeurs de C. il y a Également une zone de texte. La valeur de la textbox est générer par ajax lors de la modification de l'événement est de tirer de ces trois listes déroulantes.

Voici le xhtml:

<p:selectOneMenu id="customerMenu" value="#{adminController.activityDTO.customerId}" required="true" label="Customer Name" style="width: 200px">
    <f:selectItem itemLabel="Select One" itemValue="" />
    <f:selectItems value="#{adminController.customers}" var="customer" itemLabel="#{customer.customerName}" itemValue="#{customer.customerId}" />
    <p:ajax listener="#{adminController.generateActivityName}" update="activityId" />                       
</p:selectOneMenu>

<p:selectOneMenu id="activityTypeMenu" value="#{adminController.activityDTO.activityParentType}" required="true" label="Activity Type"
    style="width: 200px">
    <f:selectItem itemLabel="Select One" itemValue="" />
    <f:selectItems value="#{adminController.activityTypes}" var="activityType" itemLabel="#{activityType.parent}" itemValue="#{activityType.parent}" />
    <p:ajax listener="#{adminController.updateDependentActivity}" update="activitySubType" />
</p:selectOneMenu>

<p:selectOneMenu id="activitySubTypeMenu" value="#{adminController.activityDTO.activitySubType}" required="true" label="Activity Sub Type"
    style="width: 200px">
    <f:selectItem itemLabel="Select One" itemValue="" />
    <f:selectItems value="#{adminController.activitySubTypes}" var="activityType" itemLabel="#{activityType.name}" itemValue="#{activityType.id}" />
    <p:ajax listener="#{adminController.generateActivityId}" update="activityId" />
</p:selectOneMenu>

<p:inputText id="activityId" autocomplete="off" readonly="true" value="#{adminController.activityDTO.activityId}"
    label="#{adbBundle['admin.addActivityPanel.addActivityTable.activityId']}" required="true" />

La activityTypeMenu et activitySubTypeMenu sont dépendants, par la valeur sélectionnée de la activityTypeMenu je suis le remplissage de la activitySubTypeMenu.

Maintenant, les problèmes que je suis confronté est:

  • Dire que j'ai sélectionner "Externe" et "Interne" dans activityTypeMenu et par défaut ", Sélectionnez l'Un". Si je choisis "Externe" de l' activityTypeMenu la activitySubTypeMenu aura "Projet" et "Service". Mais alors, si je choisis l'option "Sélectionner" les activitySubTypeMenu détient encore le déjà rempli dynamiquement des valeurs. C'est parce que le required="true" attribut résistant au feu le backend de la méthode à partir de laquelle je suis le chargement de la dynamique de la valeur.
  • J'ai essayé de définir le itemValue de <f:selectItem itemLabel="Select One" itemValue="" /> à #{null} et puis le backend méthode de tir sur la sélection de la "Sélectionnez une option" et je peux créer une liste vide à activitySubTypes et de cette façon, le activitySubTypeMenu se vider. Mais dans ce cas, la required="true" devient vide de sens. Je veux dire, j'ai aussi le bouton de sauvegarde et cliquer sur le bouton sans sélectionner l'option (c'est la sélection "Select") à partir de activityTypeMenu et activitySubTypeMenu de ne pas jeter de ValidatorException et les composants ne sont pas arriver de style par l'erreur de la classe css de Primefaces.
  • Aussi si je n'ai pas mis le itemValue de <f:selectItem itemLabel="Select One" itemValue="" /> à #{null} puis-modification de la valeur sélectionnée pour l'option par défaut("Select") n'est pas l'effacement de l' activityId p:inputText. Si j'utilise #{null} alors je peux obtenir le backend méthode de cuisson à partir de laquelle je peux définir la valeur de la zone de texte vide.

Comment ca je résoudre ce problème et d'obtenir le résultat désiré. Ce que je veux:

  • Si l'option est réglée sur "Sélectionner" alors dépendante menu sera vide et que de la zone de texte.
  • Je veux utiliser le required="true" attribut.
Avez-vous essayé avec process="@this" attribut dans p:ajax tags? Ce qui évite la validation des autres composants de formulaire, parce que seule la composante que vous êtes en train de changer traitées par la JSF le cycle de vie. Si vous ne travaillez pas, le plus simple (mais pas le meilleur) moyen de le faire fonctionner en serait de se débarrasser de required="true" attributs et de valider le formulaire entièrement quand il est envoyé. Bonne chance.
Cependant, je pense que déjà p:ajax par défaut @this.
oui le p:ajax valeur par défaut est @this
Essayez d'utiliser la noSelectionOption="true" drapeau sur votre <f:selectItem/>. Il est réservé indicateur qui provoque l'exécution d'évaluer votre sélection différemment.
selon code.google.com/p/primefaces/issues/detail?id=4582 il a un bug avec noSelectionOption.

OriginalL'auteur Tapas Bose | 2013-01-26