Поверхности. Значения фильтра Datatable теряются после обновления данных.
Я использую JSF 2.0 и Primefaces 3.2. У меня есть основная форма с datatable и кнопка на каждой строке, которая вызывает диалог с другой таблицей данных. Диалог имеет свою собственную форму. Когда в диалоговом окне выбирается строка данных, я обрабатываю выбор, а затем обновляю данные в основной форме. После обновления все мои фильтры на основном datatable теряются. Есть ли способ запомнить значения фильтра?
Моя страница 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>
Мой контроллер
В моем контроллере все, что я делаю, снова увлажняет мой datatable.
@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();
}
}
Ответы
Ответ 1
Если это запрос AJAX, вы можете добавить на свой компонент триггера метод "oncomplete", который имеет:
<p: ... update='myDatatableId' oncomplete='myDatatableWidget.filter();' />
Таким образом, вы повторно запускаете текущие фильтры в datatable или вы также можете очистить все фильтры, используя
... oncomplete='myDatatableWidget.clearFilters();' ...
Ответ 2
Мы также придумали немного более элегантное решение, чем тот, который был отправлен kolossus, который так же прост, как расширение PF Datatable для постоянных значений фильтра.
http://www.stickysession.com/?p=258
Ответ 3
Поскольку вы должны обновить таблицу из своей формы (чтобы она сохранила состояние фильтра), другим решением могло быть размещение скрытой кнопки в основной форме таблицы и использование ее в качестве "прокси", щелкнув ее с вашего диалог, таким образом фильтр будет сохранен, как этот
измените свою кнопку с
<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"/>
используя эту технику, вам не понадобится, чтобы вызвать фильтрацию вручную, и никакое дополнительное "мигание" не появится на экране