У меня 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
, но это должно быть необходимо, поскольку все элементы в таблице данных должны быть действительными.