在popupPanel中选择extendedDataTable不在Ajax请求参数中

在popupPanel中选择extendedDataTable不在Ajax请求参数中,ajax,jsf,datatable,request,richfaces,Ajax,Jsf,Datatable,Request,Richfaces,我有一个JSF页面,其中包含来自Richfaces的模式popupPanel,在这个popupPanel中是一个extendedDataTable。现在,每当用户选择新行时,我希望在我的bean中有用户选择。首先我想展示代码,然后我会解释问题 包含popupPanel和extendedDatatable的xhtml页面的一部分: <rich:popupPanel id="kontaktPanel" modal="true" onmaskclick="#{rich:component('ko

我有一个JSF页面,其中包含来自Richfaces的模式popupPanel,在这个popupPanel中是一个extendedDataTable。现在,每当用户选择新行时,我希望在我的bean中有用户选择。首先我想展示代码,然后我会解释问题

包含popupPanel和extendedDatatable的xhtml页面的一部分:

<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>
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 );
    }

}

与侦听器和所需成员对应的bean:

<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>
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 );
    }

}
公共类NachfrageBean{
私人康塔克托康塔克特;
私有列表loadedKontakte=newArrayList();
/**记录我*/
私人收藏选择;
公共集合getSelection(){
返回选择;
}
公开选举(集合选择){
this.selection=选择;
}
公共列表getLoadedKontakte(){
//联系人已成功加载
return kontaktBusiness.getAllKontakte();
}
公共空塔克托-格特空塔克特(){
返回康塔克;
}
公共无效设置空塔(空塔至空塔){
this.kontakt=kontakt;
}
public void selectedRecord(AjaxBehaviorEvent事件){
UIExtendedDataTable=(UIExtendedDataTable)事件。getComponent();
Object originalKey=dataTable.getRowKey();
用于(对象选择键:选择){
dataTable.setRowKey(selectionKey);
if(dataTable.isRowAvailable()){
//对选择做些什么
}
}
dataTable.setRowKey(originalKey);
}
}
当用户选择datatable中的一行时,侦听器被成功调用,但选择为null,因此我得到了一个NPE。当我删除popupPanel并将extendedDatatable直接放在我的页面中时,它就可以正常工作了。我总是打印出请求参数,当我在pupupanel中有datatable时,我可以看到有两个缺少的参数。这些请求参数是:

  • 主要表格:Kontaktable:wi=
  • 主要形式:kontaktable:si=3,3 | 3 | x
因此,在弹出窗口之外,Kontaktable中的选择会被提交,但在弹出面板内部则不会。有人知道这里出了什么问题吗?

我刚找到一个

默认情况下,rich:popupPanel将附加到主体,而不是表单。将domElementAttachment=“form”添加到popupPanel就可以做到这一点