我有一个JSF页面,其中包含Richfaces的模式popupPanel,而这个popupPanel里面是一个extendedDataTable。现在,我想在每次用户选择新行时在我的bean中选择用户。首先,我想展示代码然后我将解释这个问题。
xhtml页面的一部分,包含popupPanel和extendedDatatable:
<rich:popupPanel id="kontaktPanel" modal="true" onmaskclick="#{rich:component('kontaktPanel')}.hide()">
<rich:extendedDataTable
value="#{nachfrageBean.loadedKontakte}" var="kontakt"
selection="#{nachfrageBean.selection}" id="kontaktTable">
<rich:column>
<f:facet name="header">
<h:outputText value="#{messages['tabelle.kontakt.instknz']}" />
</f:facet>
<h:outputText value="#{kontakt.instKnz}" />
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="#{messages['tabelle.kontakt.name']}" />
</f:facet>
<h:outputText value="#{kontakt.name}" />
</rich:column>
<a4j:ajax execute="kontaktTable kontaktPanel" event="selectionchange" listener="#{nachfrageBean.selectedRecord}" />
</rich:extendedDataTable>
</rich:popupPanel>
与侦听器和所需成员对应的bean:
public class NachfrageBean {
private KontaktDTO kontakt;
private List<KontaktDTO> loadedKontakte = new ArrayList<KontaktDTO>();
/** DOCUMENT ME! */
private Collection<Object> selection;
public Collection<Object> getSelection() {
return selection;
}
public void setSelection( Collection<Object> selection ) {
this.selection = selection;
}
public List<KontaktDTO> getLoadedKontakte() {
//contacts are successfully loaded
return kontaktBusiness.getAllKontakte( );
}
public KontaktDTO getKontakt() {
return kontakt;
}
public void setKontakt( KontaktDTO kontakt ) {
this.kontakt = kontakt;
}
public void selectedRecord( AjaxBehaviorEvent event ) {
UIExtendedDataTable dataTable = ( UIExtendedDataTable )event.getComponent();
Object originalKey = dataTable.getRowKey();
for( Object selectionKey : selection ) {
dataTable.setRowKey( selectionKey );
if( dataTable.isRowAvailable() ) {
// do something with the selection
}
}
dataTable.setRowKey( originalKey );
}
}
当用户在数据表中选择一行时,会成功调用侦听器,但选择为空,因此我得到一个NPE。当我删除popupPanel并将我的extendedDatatable直接放在我的页面中时,它可以正常工作。我总是打印出请求参数,当我在pupupPanel中有数据表时,我可以看到有两个缺少的参数。这些请求参数是:
因此,在弹出窗口之外,kontaktTable的选择会被提交,但不会在popupPanel内部提交。有谁知道这里有什么不对吗?
答案 0 :(得分:1)
我刚刚找到solution here。
默认情况下,rich:popupPanel将附加到正文而不是表单。将domElementAttachment =“form”添加到popupPanel就可以了。