Как мне объединить JSF Ajax с представлениями в закладках? - PullRequest
2 голосов
/ 11 марта 2012

У меня есть p: dataTable и ряд элементов управления, которые изменяют его содержимое, например номер страницы, сортировку и параметры фильтра.Элементы управления вызывают взаимодействие AJAX, так что каждое изменение вызывает SQL-запрос к внутренней части, но обновляет только таблицу в клиентском браузере.Так и должно быть, верно?

То, что я не могу понять, - это лучшая практика для создания представления с возможностью создания закладок.Достаточно легко получить параметры закладки в базовом компоненте, такие как:

        <f:metadata>
            <f:viewParam name="orderNo" value="#{bean.orderNo}" />
            <f:viewParam name="sortOrder" value="#{bean.sortOrder}" />
            <f:viewParam name="showOpenItems" value="#{bean.showOpenItems}" />           
            <f:viewParam name="page" value="#{bean.page}" />
            <f:viewParam name="pageSize" vlaue="#{bean.pageSize}" />
        </f:metadata>

Итак, я добавляю элемент управления radioButton, чтобы изменить sortOrder.Это может выглядеть так:

<p:selectOneRadio value="#{bean.sortOrder}">
   <p:ajax update="@form" />
   <f:selectItem itemLabel="xxx" itemValue="1" />
      (etc)
</p:selectOneRadio>

Первый вопрос: при запуске этого элемента управления с поддержкой AJAX есть ли способ сохранить ДРУГИЕ параметры, такие как orderNo , без обращения к компоненту ViewScoped?

Второй вопрос: как я могу обновить адресную строку браузера, чтобы, если пользователь добавляет в закладки страницу, все текущие параметры запроса таблицы были сохранены?

Большое спасибо за любую помощь.

1 Ответ

2 голосов
/ 27 июня 2017

Вы можете добавить параметры к любому компоненту, используя <f:param> и считывая его из вашего компонента поддержки области запроса.Вы можете использовать функцию OmniFaces Components.getParams(UIComponent).

<p:selectOneRadio value="#{bean.sortOrder}">
    <p:ajax listener="#{bean.reload()}" update="@form" />
    <f:selectItem itemLabel="xxx" itemValue="1" />

    <f:param name="orderNo" value="#{bean.orderNo}"/>
</p:selectOneRadio>

Извлечение параметров из компонента в компоненте запроса:

public void reload()
{
    final FacesContext context = FacesContext.getCurrentInstance();
    final UIComponent component = UIComponent.getCurrentComponent(context);

    List<ParamHolder> params = Components.getParams(component);

    // extract orderNo param and reload your datasource
}

Чтобы обновить URL браузера, вы можете выполнить GET-запросы вместо ajaxили вы можете манипулировать им с помощью API истории JavaScript.

Для первой части вы можете использовать эту функцию bean-компонента утилиты в ваших компонентах ajax или command.

/**
 * Redirects to the given outcome by building a bookmarkable URL using all
 * child UIParameter's of the current component.
 *
 * @param outcome
 * @param includeViewParam
 *
 * @return
 */
public void performActionParams(final String outcome, boolean includeViewParam)
{
    final FacesContext context = FacesContext.getCurrentInstance();
    final UIComponent component = UIComponent.getCurrentComponent(context);

    List<ParamHolder> params = Components.getParams(component);

    String url = FacesLocal.getBookmarkableURL(context, outcome, params, includeViewParam);
    FacesContextUtils.redirect(context, url);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...