Richfaces tabPanel — использование одной и той же страницы для разных вкладок, динамически меняющих содержимое

Я использую Seam 2.1.2 и RichFaces 3.3.2.SR1.

<a4j:form>
    <rich:tabPanel switchType="ajax">
        <rich:tab label="TAB 1" actionListener="#{outControl.tab1}" immediate="true">
            <ui:include src="/pages/agenda/TabContain.xhtml" />
        </rich:tab>
        <rich:tab label="TAB 2" actionListener="#{outControl.tab2}">
            <ui:include src="/pages/agenda/TabContain.xhtml" />
        </rich:tab>
        ...

TabContain.xhtml:

<rich:extendedDataTable value="#{manBean.seDataModel}" var="out" id="bc_table" 
    sortMode="#{manBean.sortMode}" selectionMode="#{manBean.selectionMode}" 
    tableState="#{manBean.tableState}" selection="#{manBean.selection}" 
    rowKeyVar="rkvar">
    <rich:column sortable="false" id="bc_col_0">
        ...

Содержимое extendedDataTable должно зависеть от выбранной вкладки. Мой первый подход заключался в том, чтобы установить actionListener на вкладках и изменить manBean в этом действии. После этого actionListener даже если я вижу в логах, что manBean изменился, это не отражается на странице в браузере. Как будто не освежает. Я пытался установить rerender в rich:tab, но это тоже не работает.

Любая идея? Также доволен другими подходами, это может быть не лучшим.


person Community    schedule 24.02.2010    source источник


Ответы (2)


Не уверен, что смогу легко выразить это словами, но вот оно... Если у вас есть фиксированное количество вкладок и вы заранее знаете возможные значения, рассмотрите возможность передачи параметра повторно используемому шаблону через ui:param.

Пример шаблона с панелью вкладок

<rich:tabPanel switchType="ajax">
  <rich:tab label="TAB 1" >
      <ui:include src="/pages/agenda/TabContain.xhtml">
         <ui:param name="dataModel" value="#{dataBean.dataset1}" />
      </ui:include>
  </rich:tab>
  <rich:tab label="TAB 2">
     <ui:include src="/pages/agenda/TabContain.xhtml">
       <ui:param name="dataModel" value="#{dataBean.dataset2}" />
     </ui:include>
  </rich:tab>

Затем в шаблоне reusableDataTable

<rich:extendedDataTable value="#{dataModel}" ....>
    <rich:column sortable="false" id="bc_col_0">
....
</rich:extendedDataTable>

Затем значение "dataModel" будет передано в TabContain.xhtml в качестве параметра и заменено везде, где есть #{dataModel}.

Надеюсь, это поможет, я делаю это в основном в нашем проекте.

person Community    schedule 25.02.2010

хорошо, описанный выше подход сработал после пары попыток использования actionListener (я не менял правильный атрибут).

actionListener

1- он срабатывает при выборе вкладки 2- он захватывает управляемый компонент через:

ManBean mb = (ManBean) context.getExternalContext().getSessionMap().get("manBean");

3- он изменяет управляемый компонент, который является value в extendedDataTable

4- important!: добавьте f:subview вокруг каждого -ui:include-, чтобы избежать ошибки "повторяющийся идентификатор компонента"!

Не могли бы вы сказать, что есть лучший подход для этого?

Спасибо.

person Community    schedule 24.02.2010
comment
Это похоже на подход, который я бы выбрал. Вы можете объединить свои образцы кода на стороне сервера с ответом Рича Тейлора выше. - person Lisa; 06.12.2013