Требуемая проверка в зависимости от конкретной кнопки, не работающей в Wizard

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

<h:form id="form" enctype="multipart/form-data" acceptcharset="ISO-8859-1" >  

    <p:growl id="growl" sticky="true" showDetail="true"/>  

    <p:wizard id="wizard" flowListener="#{myBean.onFlowProcess}" showNavBar="false" widgetVar="wizardWV"> 

        <p:tab id="tab1" title="Tab 1"  >  
            <p:panel header="Panel for tab 1">  

                <p:message for="year" />
                <br /> 

                <table>
                    <tr>
                        <td>
                            <h:outputLabel value="Year: "  />
                        </td>
                        <td>
                            <p:inputMask 
                                id="year"
                                value="#{myBean.year}" 
                                required="#{not empty param[nextPanel.clientId]}"
                                requiredMessage="Year is required!"
                                style="width:70px;"  
                                mask="9999" 
                                maxlength="4" 
                            />
                        </td>
                    </tr>
                </table>
            </p:panel>
        </p:tab>

        <p:tab id="tab2" title="Tab 2"  >  
            <p:panel header="Panel for tab 2">  
            </p:panel>
        </p:tab>

    </p:wizard>

    <p:commandButton id="backPanel"  value="Back" onclick="PF('wizardWV').back();" styleClass="internalButton"  />
    <p:commandButton id="nextPanel" binding="#{nextPanel}" value="Next" onclick="PF('wizardWV').next();" styleClass="internalButton" />

</h:form> 

Ответ 1

почему этот вопрос не был дан ответ? как @BalusC сказал, ответ прост, просто поместите @process="this"

<h:form>
    <p:wizard id="wizard" showNavBar="false" widgetVar="wizardWV">
        <p:tab id="tab0" title="Tab 0">
            <p:panel header="Panel for tab 0">
                blablabla
            </p:panel>
        </p:tab>

        <p:tab id="tab1" title="Tab 1">
            <p:panel header="Panel for tab 1">
                <p:message for="year" />
                <br />

                <h:panelGrid columns="2">
                    <h:outputLabel value="Year: " />
                    <p:inputMask id="year" value="#{myBean.year}" required="true"
                        requiredMessage="Year is required!" style="width:70px;" mask="9999"
                        maxlength="4" />
                </h:panelGrid>
            </p:panel>
        </p:tab>

        <p:tab id="tab2" title="Tab 2">
            <p:panel header="Panel for tab 2">
                blablabla
            </p:panel>
        </p:tab>
    </p:wizard>

    <p:commandButton value="Back" onclick="PF('wizardWV').back();" />
    <p:commandButton process="@this" value="Next" onclick="PF('wizardWV').next();" />
</h:form>

или лучше, чтобы избежать дублирования запроса ajax

<p:commandButton type="button" value="Back" onclick="PF('wizardWV').back();" />
<p:commandButton type="button" value="Next" onclick="PF('wizardWV').next();" />

но я действительно не вижу смысла использовать пользовательскую панель навигации для мастера в этом случае.


если вы имеете в виду "скин", указав "дизайн", правильный подход заключается в переопределении стилей PF CSS:

Wizard resides in a container element that style and styleClass attributes apply.
Following is the list of structural css classes.

Selector               Applies
.ui-wizard             Main container element.
.ui-wizard-content     Container element of content.
.ui-wizard-step-titles Container of step titles.
.ui-wizard-step-title  Each step title.
.ui-wizard-navbar      Container of navigation controls.
.ui-wizard-nav-back    Back navigation control.
.ui-wizard-nav-next    Forward navigation control.

Но если вы действительно имеете в виду "дизайн", предназначенный как функции/функциональные возможности, да, вы можете взаимодействовать с мастером с помощью своего "виджета" и, как и вы, определять свои собственные элементы управления. В вашем конкретном случае я не вижу разницы в "дизайне", я вижу стандартное поведение компонента мастера, где обрабатывается текущая вкладка мастера (и все ее компоненты проверены) при нажатии следующей кнопки.

Проверка обрабатывается ТОЛЬКО для обработанных компонентов (которые находятся внутри списка выполнения), и вы можете управлять этим списком с помощью атрибута process="..." любого компонента/события ajax.

Вероятно, вам нужно изменить поведение по умолчанию другого компонента на той странице, на которой обрабатываются @all или @form.

Из того, что вы говорите в своем комментарии, у вас есть хотя бы один компонент на этой странице, который имеет поведение ajax, например, p:autocomplete и, возможно, вы используете PF < 4.0.

В этом случае вы можете добавить process="@this" в p:autocomplete, чтобы предотвратить обработку (а затем проверку) других компонентов на вкладке мастера, например, ваш p:inputMask.


@Erick, первое, что приходит мне в голову, это:

<p:wizard binding="#{wizardComponent}" ...>
    <p:tab id="tab0" ...>
        ...
    </p:tab>
    ...
</p:wizard>
<p:commandButton rendered="#{wizardComponent.step != 'tab0'}" value="Back" onclick="PF('wizardWV').back();" />