Подтвердить что ты не робот

<a4j: commandbutton> действие вызывается только при втором щелчке

Я хочу отправить таблицу данных нажатием кнопки, но это действие не вызывается при первом щелчке. Вот мой код:

<h:panelGrid id="addToThisDepartmentPanel">
    <h:outputText value="#{messageDataBean.message}" rendered="#{messageDataBean.isSuccess eq false}" style="color:red" id="addToThisDepartmentMessage"/>
    <h:form>
        <h:dataTable value="#{systemResultViewUtil.systemUserDetailDataBeansList}" var="departmentdetail" id="addToThisDepartmentDataTable" rendered="#{systemResultViewUtil.systemUserDetailDataBeansList.size() gt 0}">
            <h:column>
               <f:facet name="header">
                   Name
               </f:facet>
               <h:outputText value="#{departmentdetail.name}" style="text-align: left;padding-right: 120px" />
            </h:column>
            <h:column>
                <f:facet name="header">
                    Current Department
                </f:facet>
                <h:outputText value="#{departmentdetail.depName}" style="text-align: left;padding-right: 120px" />
            </h:column>
            <h:column>
                <f:facet name="header">
                    Add To This
                </f:facet>
                <h:selectBooleanCheckbox value="#{departmentdetail.cheked}" style="text-align: left;padding-right: 120px"/>
            </h:column>
         </h:dataTable>

         <a4j:commandButton oncomplete="if(#{messageDataBean.isSuccess eq true}){ closeAddToThisDepartmentDialog()}" value="Add TO This Department" action="#{departmentServiceBean.addEmployeeToThisDepartment}" id="addToThisDepartmentButton"
                                                       render=":addToThisDepartmentMessage :message" execute=":addToThisDepartmentDataTable" />
     </h:form>
</h:panelGrid>

Проблема заключается в том, что во втором клике вызывается мое действие <a4j:commandButton>. Но он не вызывается при первом нажатии.
Любые идеи?

4b9b3361

Ответ 1

Эта проблема известна как спецификация JSF 790. Если вы ajax-визуализируете некоторый контент, который, в свою очередь, содержит <h:form>, то его состояние представления будет потеряно, что приведет к тому, что первое действие внутри этой формы ничего не вызовет. В ответе ajax первого действия форма получит новое состояние представления, и, следовательно, любые последующие действия будут успешными.

Это планируется установить для предстоящего JSF 2.2. Но прямо сейчас с JSF 2.0/2.1 вы должны ввести обходной путь. Сначала вам нужно указать <h:form> фиксированный идентификатор, который yourFormId в приведенном ниже примере:

<h:panelGrid id="addToThisDepartmentPanel">
    ...
    <h:form id="yourFormId">
        ...

Затем вам нужно ссылаться на него в атрибуте render:

<f:ajax ... render=":addToThisDepartmentPanel :yourFormId" />

То же самое относится к компонентам <a4j:xxx>.

<a4j:commandButton ... render=":addToThisDepartmentPanel :yourFormId" />

См. также: