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



我有搜索表单。单击Search按钮后,数据刷新,但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>

我从myBean.initBean()myBean.submitSearch()中调用列计算方法createColumns(),结果相同(我看到它从调试器中正确工作)。

@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。注释3.1.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;
    }

您可以注释它并覆盖类文件,或者在createccolumns方法中找到DataTable对象和setColumns为NULL

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

相关内容

  • 没有找到相关文章

最新更新