Визуализация JSF не работает для элемента формы - PullRequest
1 голос
/ 05 августа 2011

У меня composite отображается внутри dialog. У меня есть кнопка edit, которая получает текущий компонент @SessionScoped (элемент в таблице данных), а затем обновляет интерфейс. Мое приложение очень похоже на простое приложение CRUD, например http://balusc.blogspot.com/2010/06/benefits-and-pitfalls-of-viewscoped.html.

Проблема в том, что пользовательский интерфейс корректно обновляется при использовании <h:outputText/>, но не при использовании элемента формы.

<h:inputTextarea value="#{cc.attrs.managedBean.assertionStatement}" />
<h:inputText value="#{cc.attrs.managedBean.assertionStatement}" />
<h:outputText value="#{cc.attrs.managedBean.assertionStatement}"/>

Пользовательский интерфейс показывает пустые textarea и input, но outputText отображает правильное значение. getAssertionStatement() вызывается 3 раза, что кажется правильным поведением.

Когда я закрываю диалог и снова открываю его, все (элемент формы) заполняется.

Вызов диалога (ag пространство имен для составного компонента):

    <p:dialog widgetVar="DataValueRuleDialog" modal="true" height="600" width="800">
        <p:outputPanel id="DataValueRulePanel">
            <ag:DataValueAssertion managedBean="#{dataValueAssertionController}" id="DataValueComposite" />
        </p:outputPanel>
    </p:dialog>

Композит, который вызывает другой композит:

    <h:form id="DataValueForm">
        <ag:assertionMetadataComponent
            managedBean="#{cc.attrs.managedBean.dataValueAssertionBean.assertionMetadataBean}"
            assertionStatementRows="5" />

        <p:dataTable value="#{cc.attrs.managedBean.model}" var="item">
            <p:column>
                <f:facet name="header">Assertion Statement</f:facet>
                <h:outputText rendered="#{item.profileBean.profileLocation == cc.attrs.managedBean.selectedComformanceProfile.name}" value="#{item.assertionMetadataBean.assertionStatement}" />
            </p:column>
            <p:column>
                <p:commandButton rendered="#{item.profileBean.profileLocation == cc.attrs.managedBean.selectedComformanceProfile.name}" value="edit" immediate="true"
                actionListener="#{cc.attrs.managedBean.editDataValueAssertion}" update=":DataValueComposite:DataValueForm">
                </p:commandButton>
            </p:column> 
        </p:dataTable>
    </h:form>

Когда я удаляю immediate=true, форма проверяется, и, поскольку одно из обязательных полей (предполагается, что оно заполнено) отсутствует, я получил ошибку проверки. Вот почему у меня есть immediate=true, но это должно быть необходимо, поскольку все элементы в таблице данных должны быть действительными.

...