我正在使用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
,但也没有这样做。
有什么想法吗?对其他方法也很满意,这可能不是最好的方法。
答案 0 :(得分:3)
我不确定我是否可以轻易地将其写入文字中,但在这里...... 如果您有固定数量的选项卡并且提前知道可能的值,请考虑通过ui:param将参数传递给可重用模板。
实施例 带有tabpanel的模板
<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 :(得分:1)
好的,上面的方法在使用actionListener几次尝试后得出结论(我没有更改正确的属性)。
actionListener
1-选中标签时会触发 2-它通过以下方式获取托管bean:
ManBean mb = (ManBean) context.getExternalContext().getSessionMap().get("manBean");
3-它修改了托管bean,value
extendedDataTable
4- important!:
在每个f:subview
周围添加ui:include
- 以避免出现“重复的组件ID”错误!
你会说有更好的方法吗?
感谢。