web-dev-qa-db-fra.com

Primefaces selectOneRadio ajax

J'essaie d'afficher des messages de validation chaque fois que l'utilisateur clique sur un bouton radio.

Cela ne fonctionne que lorsque je clique sur le bouton d'envoi, mais pas lorsque je clique sur le bouton radio:

    <h:form id="form">
        <p:panel id="panel">
            <ui:repeat value="#{questionsBean}" var="question">
                <h:panelGrid columns="3" style="margin-bottom:10px" cellpadding="5">
                    <h:outputText value="#{question.questionText}" />
                    <p:selectOneRadio id="question" value="#{question.response}"
                        validator="#{question.validate}" required="true">
                        <f:selectItem itemLabel="Yes" itemValue="Yes" />
                        <f:selectItem itemLabel="No" itemValue="No" />
                        <p:ajax update="msgQuestion" event="change"/>
                    </p:selectOneRadio>
                    <p:message for="question" id="msgQuestion" />
                </h:panelGrid>
            </ui:repeat>
            <p:commandButton id="btn" value="Save" update="panel" partialSubmit="true"/>
        </p:panel>
    </h:form>
16
DD.

L'événement HTML DOM change est le mauvais événement lorsque vous voulez savoir si le bouton radio (ou la case à cocher) est cliqué. Vous devez utiliser l'événement click pour cela.

La valeur du bouton radio (et de la case à cocher) ne change pratiquement jamais. Il a toujours la même valeur. La question est plutôt de savoir si cette valeur sera envoyée côté serveur ou non. Ceci est déterminé par l'état "vérifié" qui est généralement déclenché par l'événement DOM click.

Le comportement réel de l'événement change sur les boutons radio/cases à cocher dépend du navigateur Web utilisé. Le comportement est particulièrement incohérent dans le navigateur IE. Cela dépend non seulement de la version utilisée, mais aussi du mode de rendu utilisé (mode quirks vs mode standards). Vous utilisiez peut-être IE lors des tests.

Le type par défaut event des PrimeFaces <p:ajax> (Et le JSF standard <f:ajax>), Qui est valueChange couvre déjà automatiquement ceci:

<p:ajax update="msgQuestion" event="valueChange" />

Cela générera automatiquement le gestionnaire d'événement change droit dans les entrées de texte et les listes déroulantes et le gestionnaire d'événement click dans les boutons radio et les cases à cocher.

Mais comme dit, c'est déjà le type par défautevent. Oubliez-le tout simplement.

<p:ajax update="msgQuestion" />
33
BalusC