Primefaces刷新数据表后,数据表过滤器值将丢失

时间:2012-10-08 15:39:31

标签: jsf-2 primefaces

我正在使用JSF 2.0和Primefaces 3.2。我有一个带有数据表的主窗体和每行上的一个按钮,它会显示另一个数据表的对话框。对话框有自己的形式。在对话框中选择数据表行时,我处理选择,然后刷新主窗体中的数据表。刷新后,主数据表上的所有过滤器都将丢失。有没有办法记住过滤器值?

我的JSF页面

<h:panelGroup id="mainTable">
<h:form id="mainForm" prependId="false">                
<p:dataTable id="cl_grid1" var="item"    widgetVar="mainGrid"
                value="# {controller.items}">


<p:column headerText="Colum1" filterMatchMode="contains" filterBy="#{item.myObj.code}" sortBy="#{item.myObj.code}">
                        <h:outputText value="#{item.myObj.code}" style="float:left" />

                        <p:commandButton id="selectBtn" icon="select"
                            oncomplete="selectDialog.show()" actionListener="#{controller.setMainItem}">
                            <f:param name="selectedMainItem" value="#{item.id}"/>
                        </p:commandButton>



                </p:column>

</p:dataTable
</h:form>
</h:panelGroup>

<p:dialog id="cl_selectDialog" header="Select AAAA" dynamic="true" modal="true" widgetVar="selectDialog" 
    height="500" width="900" showEffect="explode" hideEffect="explode">

        <h:form id="selectForm" prependId="true">

            <p:dataTable id="cl_selectGrid" var="selectorItem"    widgetVar="selectGrid"
                value="# {controller.selectorItems}" selection="#{controller.selectedItem}" 
rowKey="#{selectorItem.id}" selectionMode="single">



            <p:commandButton actionListener="#{controller.processSelection}" value="Ok" icon="ui-icon ui-icon-search" 
                                    oncomplete="selectDialog.hide()" update=":mainTable" process="@form"/>
            <p:commandButton value="Cancel" icon="ui-icon ui-icon-search" onclick="selectDialog.hide()" type="button"/>
        </h:form>
    </p:dialog>

我的控制器

在我的控制器中,我正在做的是再次为我的数据表补充水分。

@Component
@Scope("view")
public class Controller extends BaseController implements Serializable {

private List<Item> items;

public Controller() {
    items = new ArrayList<Item>();  
}


@PostConstruct
public void init() {
    loadItems();
}

protected void loadItems() {
    items = //Load items from Database
}


public void processSelection(ActionEvent event) {
    //Add the selected Item and then reload items
    loadItems();
}

}

3 个答案:

答案 0 :(得分:16)

如果是AJAX请求,您可以在触发器组件上添加一个'oncomplete'方法,该方法具有:

<p: ... update='myDatatableId' oncomplete='myDatatableWidget.filter();' />

通过这种方式,您将重新触发数据表上的当前过滤器,或者您也可以使用

清除所有过滤器
 ... oncomplete='myDatatableWidget.clearFilters();' ...

答案 1 :(得分:2)

我们还提出了一个比kolossus发布的解决方案更优雅的解决方案,就像扩展PF Datatable的持久过滤器值一样简单。

http://www.stickysession.com/?p=258

答案 2 :(得分:1)

由于您必须从其表单中刷新表格(因此它将保留过滤器状态),另一种解决方案可能是在主表格表格中放置一个隐藏按钮,并将其用作代理服务器&#39;通过在对话框中单击它,这样就可以保留过滤器,就像这样

更改按钮
 <p:commandButton actionListener="#{controller.processSelection}" value="Ok" icon="ui-icon ui-icon-search" 
     oncomplete="selectDialog.hide()" update=":mainTable" process="@form"/>

到这个(只是一个点击隐藏的按钮的简单按钮)

 <p:commandButton onclick="$('#my-proxy-button-id').click(); return false;" value="Ok" icon="ui-icon ui-icon-search"/>

并在主表格中添加一个新按钮

 <p:commandButton style="display:none;" id="my-proxy-button-id" actionListener="#{controller.processSelection}" 
     oncomplete="selectDialog.hide()" update="mainTable" process=":selectForm"/>

使用这种技术,您不需要手动调用过滤,也不需要额外的&#34;闪烁&#34;将出现在屏幕上