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

时间:2013-12-18 08:36:49

标签: ajax jsf datatable request richfaces

我有一个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中有数据表时,我可以看到有两个缺少的参数。这些请求参数是:

  • mainForm:kontaktTable:wi =
  • mainForm:kontaktTable:si = 3,3 | 3 || x

因此,在弹出窗口之外,kontaktTable的选择会被提交,但不会在popupPanel内部提交。有谁知道这里有什么不对吗?

1 个答案:

答案 0 :(得分:1)

我刚刚找到solution here

默认情况下,rich:popupPanel将附加到正文而不是表单。将domElementAttachment =“form”添加到popupPanel就可以了。