刷新PrimeFaces表单元素dataTable(提供代码详细信息)

时间:2015-07-14 09:57:08

标签: jsf primefaces

我有搜索表单。单击“搜索”按钮后,数据将刷新,但不会显示dataTable列(仅在第二个按钮单击时才会刷新列)。显然我做错了什么。动态列代码的灵感来自PrimeFaces Showcase

myForm.xhtml:

<h:form id="MY_FORM">
    #{myBean.initBean()}
    ...
    <h:panelGrid id="main">
        <h:panelGrid id="buttons">
            <p:commandButton id="submitSearch"
                             value="#{msg['button.execute']}"
                             actionListener="#{myBean.submitSearch}"
                             update="resultPanel"/>
        </h:panelGrid>
    </h:panelGrid>

    <h:panelGrid id="resultPanel" border="0">
        <p:dataTable id="resultTable" var="result" value="#{myBean.searchResults}">
            <p:columns value="#{myBean.columns}" var="column" columnIndexVar="colIndex">
                <f:facet name="header">
                    <h:outputText value="#{column.header}" />
                </f:facet>
                <h:outputText value="#{result[column.property]}" />
            </p:columns>
        </p:dataTable>
    </h:panelGrid>
</h:form>

我从createColumns()myBean.initBean()调用了列计算方法myBean.submitSearch()并得到了相同的结果(我看到它在调试器中正常工作)。

@ManagedBean("myBean")
@Scope(value = "session")
public class MyBean {
    private ArrayList<HashMap<String,Object>> searchResults;
    private List<ColumnModel> columns;
    ...
    public void initBean() {
        ...
        createColumns(selectedDates);
    }

    public void submitSearch() {
        ...
        ArrayList<HashMap<String, Object>> results = prpRepository.getSearchResultByParams(searchParams);
        createColumns(selectedDates);
    }

    private void createColumns(ArrayList<String> selectedDates){
        columns = new ArrayList<ColumnModel>();   
        columns.add(new ColumnModel("Name", "NAME"));
        columns.add(new ColumnModel("Amount", "AMOUNT"));

        for (int i = 0; i < selectedDates.size(); i++) {
            columns.add(new ColumnModel(selectedDates.get(i), "DATE" + i));
        }

        setColumns(columns);
    }

    public List<ColumnModel> getColumns() {
        return columns;
    }

    public void setColumns(List<ColumnModel> columns) {
        this.columns = columns;
    }
}

其他信息: 我正在使用:

  • Oracle对JSF 2.1规范的实现
  • JavaServer Pages API 2.2
  • Springframework 3.1.2(包括spring-context,spring-web)
  • Glassfish Javax.annotation 3.1.1

2 个答案:

答案 0 :(得分:1)

问题是org.primefaces.component.datatable.DataTabe中的列只被计算一次

public List<UIColumn> getColumns() {
       // if(columns == null) {     
            columns = new ArrayList<UIColumn>();
            FacesContext context = getFacesContext();
            char separator = UINamingContainer.getSeparatorChar(context);            
            for(UIComponent child : this.getChildren()) {
                if(child instanceof Column) {
                    columns.add((UIColumn) child);
                }
                else if(child instanceof Columns) {
                    Columns uiColumns = (Columns) child;                    
                    String uiColumnsClientId = uiColumns.getClientId(context);
                    uiColumns.updateModel(); /* missed code */
                    for(int i=0; i < uiColumns.getRowCount(); i++) {
                        DynamicColumn dynaColumn = new DynamicColumn(i, uiColumns);
                        dynaColumn.setColumnKey(uiColumnsClientId + separator + i);
                        columns.add(dynaColumn);
                    }
                }
            }
       // }        
        return columns;
    }

您可以对其进行评论并覆盖该类文件, 或者在createColumns方法

中找到DataTable对象和setColumns为NULL

答案 1 :(得分:-1)

最后,我在调试器方面做得更好,并找到了答案。解决方案是将createColumns()方法调用放入getter getColumns()列,因为它会在submitSearch()之前自动调用。我的问题在于应用程序生命周期理解。