我在composite
内显示dialog
。我有一个edit
按钮,用于获取当前bean @SessionScoped
(数据表中的项),然后更新UI。我的应用程序非常类似于http://balusc.blogspot.com/2010/06/benefits-and-pitfalls-of-viewscoped.html这样的简单CRUD应用程序。
问题是在使用<h:outputText/>
时UI正确更新,但在使用表单元素时却没有。
<h:inputTextarea value="#{cc.attrs.managedBean.assertionStatement}" />
<h:inputText value="#{cc.attrs.managedBean.assertionStatement}" />
<h:outputText value="#{cc.attrs.managedBean.assertionStatement}"/>
UI显示空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
,但它应该是必要的,因为数据表中的所有项都应该有效。