JSF 1.2 всплывающее окно после проверки и закрытия не загружает новые данные - PullRequest
1 голос
/ 22 мая 2011

Я использую всплывающее окно, где всплывающее окно находится на панели богатых моделей когда я пытаюсь создать новое значение и нажимаю кнопку «Сохранить», а значение, в котором требуется «истина», отсутствует, я получаю сообщение об ошибке (как я хочу !!!!), но если этот человек нажмет кнопку «Закрыть» (кнопка x) в следующий раз это поп загружается и вызывается showmodelpanel (в режиме обновления, где я пытаюсь взять значение города из bean-компонента jsf) значение не записывается (там, где он должен быть один !!!! это мой баг)

Я хочу, чтобы после того, как кто-то закрыл мое всплывающее окно, даже подумав, что он получил ошибочный массаж из грани проверки ', при следующем открытии всплывающего окна будут введены новые значения

ВНИМАНИЕ: отключенная грань в порядке, но вставка значений не является (нечетной ....)

Может кто-нибудь объяснить, в чем проблема (возможно, что-то о лицах jsf, как я могу восстановить исходное состояние страницы после ошибки проверки?)

  <rich:modalPanel id="DefineEntityAddress" width="400" height="300"
autosized="true">
<h:graphicImage value="/images/close.png" styleClass="hidelink"
            id="DefineEntityAddressHidelink" />
        <rich:componentControl for="DefineEntityAddress"
            attachTo="DefineEntityAddressHidelink" event="onclick"
            operation="hide">

. , .

 <h:form>
 <t:div style="display:block;height:17px;">
                        <rich:comboBox required="true" id="suggestionBoxCity"
                            value="#{DefineEntityAddressControl.chossenCity}"
                            suggestionValues="#{DefineEntityAddressControl.allCityNames}"
                            directInputSuggestions="true" required="true"
                            disabled="#{DefineEntityAddressControl.readOnly}"
                            listStyle="text-align: right;" tabindex="12">
                            <a4j:support event="onchange" reRender="suggestionBoxStreet"></a4j:support>
                        </rich:comboBox>
                    </t:div>
                    <a4j:outputPanel ajaxRendered="true">
                        <t:message for="suggestionBoxCity" styleClass="dyna_error"></t:message>
                    </a4j:outputPanel>
                </a4j:region>


<a4j:commandButton id="save" value="#{l.save}"
            oncomplete=" closeModalPanel();"                
            reRender="hidden,saveError,saveError1,#{DefineEntityAddressControl.ok ? DefineEntityAddressControl.callinglabalTorerender : l.end_date}"
            disabled="#{DefineEntityAddressControl.toDelivery}"
            action="#{DefineEntityAddressControl.save}"
            styleClass="actionButton" />

</h:form>

</rich:modalPanel>

1 Ответ

1 голос
/ 20 июля 2011

Это известная функция JSF.Когда форма отправлена, компоненты в дереве JSF обновляются в соответствии с представленными значениями.Тогда проверка не удалась, поэтому модель (DefineEntityAddressControl.chossenCity и т. Д.) Не обновляется.Но представленные значения все еще находятся в дереве компонентов, и JSF юридически отображает эти значения в пользовательском интерфейсе (что позволяет пользователю исправить это).

Решение состоит в том, чтобы очистить отправленное значение при нажатии кнопки «Закрыть».

/**
 * Clears all the submitted values of input components in the same form as the specified component.
 * Call this method from action listener, e.g.
 * In Java bean:
 * {@code
 * public void processCloseAction(ActionEvent e) {
 *    clearSubmittedValues(e.getComponent());
 * }
 * }
 *
 * At page:
 * {@code
 * <a4j:commandButton actionListener="#{bean.processCloseAction}"
 *                    ajaxSingle="true"
 *                    limitToList="true"
 *                    oncomplete="Richfaces.hideModalPanel('#{id}')"
 *                    value="Cancel"/>
 * }
 *
 * @param component child of the form to be cleared
 */
public void clearSubmittedValues(UIComponent component) {
    while (component != null) {
        if (component instanceof UIForm || component instanceof UIAjaxRegion
                || component instanceof UIModalPanel) {
            clearRegion(component);
        }
        component = component.getParent();
    }
}

public void clearRegion(UIComponent parent) {
    for (UIComponent component : parent.getChildren()) {
        if (component instanceof EditableValueHolder) {
            EditableValueHolder input = ((EditableValueHolder) component);
            input.setSubmittedValue(null);
            // The following is only needed for immediate input components
            // but it won't do any harm in other situations..
            input.setValue(null);
            input.setLocalValueSet(false);
        } else {
            clearRegion(component);
        }
    }
}
...