Свойство бина не обновляется в действии - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть следующая страница Facelet:

        <ui:define name="content">

            <h:form id="selectReport">

                <div>
                    <h:selectOneMenu value="#{reportsController.selectedReport}">
                        <f:selectItems value="#{reportsController.reportsList}"/>
                    </h:selectOneMenu>
                </div>
                <div>

                    <h:commandButton value="Ir al reporte"
                                     action="#{reportsController.goToReport}"/>

                </div>
            </h:form>

            <h:form id="dateRangeSetupForm"
                    rendered="#{reportsController.showDateRangeSetupForm}">
                <div>
                    <h:outputLabel value="Desde:"/>
                    <h:inputText id="fromDate"
                                 value="#{reportsController.fromDate}"/>
                </div>
                <div>
                    <h:outputLabel value="Hasta:"/>
                    <h:inputText id="toDate"
                                 value="#{reportsController.toDate}"/>
                </div>
            </h:form>

            <h:form id="billOfLadingSetupForm"
                    rendered="#{reportsController.showBillOfLadingSetupForm}">
                <div>
                    <h:outputLabel value="# Factura:"/>
                    <h:inputText id="invoiceNumber"
                                 value="#{reportsController.invoiceNumber}"/>
                </div>
            </h:form>


            <h:form id="submitForm">
                <h:commandButton id="processReport" value="Generar Reporte"
                                 action="#{reportsController.processReport}"/>
                <h:commandButton id="goBack" value="Regresar"
                                 action="mainMenu"/>
            </h:form>

        </ui:define>

В котором я позволяю пользователю выбирать отчет и отображать форму для настройки параметров в зависимости от отчета. Проблема в том, что когда я рендерирую, например, billOfLadingSetupForm и заполняю inputText, затем нажимаю кнопку processReport, свойство invoiceNumber моего компонента не обновляется, оно устанавливается на null.

Я заметил, что если я наберу Return после заполнения inputText и затем нажму кнопку processReport, свойство будет обновлено. Это странно, я не сталкивался с этой проблемой раньше. У вас есть идеи, почему это происходит?

1 Ответ

1 голос
/ 22 декабря 2011

Всякий раз, когда форма отправляется, будут отправляться только данные внутри этой формы.Данные других форм не будут отправлены.Это по спецификации HTML.Вам нужно поместить все входы и кнопки, которые принадлежат друг другу, внутри одинаково <h:form>.Замените все ваши разделенные формы dateRangeSetupForm, billOfLadingSetupForm и submitForm на <h:panelGroup> и поместите их все в одну и ту же <h:form>.

Примерно так:

<ui:define name="content">
    <h:form>
        <div>
            <h:selectOneMenu value="#{reportsController.selectedReport}">
                <f:selectItems value="#{reportsController.reportsList}"/>
            </h:selectOneMenu>
        </div>
        <div>
            <h:commandButton value="Ir al reporte" action="#{reportsController.goToReport}"/>
        </div>
    </h:form>

    <h:form>
        <h:panelGroup id="dateRangeSetupForm" rendered="#{reportsController.showDateRangeSetupForm}">
            <div>
                <h:outputLabel value="Desde:"/>
                <h:inputText id="fromDate" value="#{reportsController.fromDate}"/>
            </div>
            <div>
                <h:outputLabel value="Hasta:"/>
                <h:inputText id="toDate" value="#{reportsController.toDate}"/>
            </div>
        </h:panelGroup>

        <h:panelGroup id="billOfLadingSetupForm" rendered="#{reportsController.showBillOfLadingSetupForm}">
            <div>
                <h:outputLabel value="# Factura:"/>
                <h:inputText id="invoiceNumber" value="#{reportsController.invoiceNumber}"/>
            </div>
        </h:panelGroup>

        <h:commandButton id="processReport" value="Generar Reporte" action="#{reportsController.processReport}"/>
        <h:commandButton id="goBack" value="Regresar" action="mainMenu"/>
    </h:form>
</ui:define>

Убедитесь, что компонент помещен в область видимости.В противном случае условия для атрибута rendered не будут сохранены.См. Также commandButton / commandLink / ajax действие / метод прослушивателя не вызван или входное значение не обновлено

...