Поверхности selectOneRadio ajax

Я пытаюсь отображать сообщения проверки каждый раз, когда пользователь нажимает на переключатель.

Это работает, когда я нажимаю кнопку отправки, но не при нажатии на переключатель:

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

Ответы

Ответ 1

Событие HTML DOM change является неправильным событием, когда вы хотите прослушать, нажата ли кнопка радио (или флажок). Вы должны использовать событие click для этого.

Значение переключателя (и флажка) в принципе никогда не изменяется. Он всегда имеет одинаковую ценность. Вопрос в том, будет ли это значение отправлено на сервер или нет. Это определяется "проверенным" состоянием, которое обычно запускается событием DOM click.

Фактическое поведение события change на радиообменах/флажках зависит от используемого веб-браузера. В браузере IE особенно непоследовательно. Это зависит не только от используемой версии, но и от используемого режима рендеринга (режим quirks vs standard). Возможно, вы использовали IE во время тестирования.

По умолчанию тип event PrimeFaces <p:ajax> (и стандартный JSF <f:ajax>), который является valueChange, уже автоматически охватывает это:

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

Это приведет к автогенерации правильного обработчика событий change в текстовых вводах и выпадающих меню и обработчике событий click в радиообменах и флажках.

Но, как сказано, это уже по умолчанию тип event. Просто опустите его вообще.

<p:ajax update="msgQuestion" />