12

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

}
4

3 に答える 3

16

AJAX リクエストの場合は、トリガー コンポーネントに「oncomplete」メソッドを追加できます。

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

このようにして、データテーブルで現在のフィルターを再トリガーするか、次を使用してすべてのフィルターをクリアすることもできます

 ... oncomplete='myDatatableWidget.clearFilters();' ...
于 2013-01-04T14:15:54.713 に答える
2

また、kolossus によって投稿されたソリューションよりも少し洗練されたソリューションも思いつきました。これは、永続的なフィルター値の PF Datatable を拡張するのと同じくらい簡単です。

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

于 2013-02-20T14:49:28.587 に答える
1

フォーム内からテーブルを更新する必要があるため (フィルター状態を保持するため)、別の解決策として、メイン テーブル フォームに非表示のボタンを配置し、ダイアログからクリックして「プロキシ」として使用することができます。このようにフィルターが保持される方法

ボタンを次から変更します

 <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"/>

この手法を使用すると、手動でフィルタリングを呼び出す必要がなくなり、追加の「点滅」が画面に表示されなくなります

于 2014-09-30T12:34:57.723 に答える