Richfaces tabPanel - использование одной и той же страницы для разных вкладок, динамическое изменение содержимого - PullRequest
3 голосов
/ 24 февраля 2010

Я использую 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, но это также не выполняется.

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

Ответы [ 2 ]

3 голосов
/ 25 февраля 2010

Не уверен, что могу легко выразить это словами, но здесь все идет ... Если у вас фиксированное количество вкладок и вы заранее знаете возможные значения, рассмотрите возможность передачи параметра в шаблон многократного использования через 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>

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

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

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

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

1 голос
/ 24 февраля 2010

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

actionListener

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

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

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

4- important!: добавьте f:subview вокруг каждого - ui:include - чтобы избежать ошибки «дубликата компонента»!

Можете ли вы сказать, что есть лучший подход к этому?

Спасибо.

...