我想有一个可重用的ui组件,与模型有关.
例如 :
>我有一个选择菜单链接到另一个选择菜单(像部门 – >子部门)
想把这个复合组件
>这个复合组件将绑定到特定的JSF Bean
我认为这个想法是有效的,如果我只使用一个复合组件.
但是,如果我使用同一类型的多个compositeComponent,这将不起作用,因为compositeComponent的JSF Bean将是相同的(在本示例中,使用视图范围),并且将共享一个或多个compositeComponents之间的状态.
这是一个粗略的例子,说明我的困惑.在这种情况下,Page1.xhtml(具有Page1Bean.java的主要模型)使用2个compositeComponents(由MyCompositeComponent.java的JSF Bean处理)
复合组件将类似于:
<!-- one composite component that has 2 chained selectOneMenus --> <h:selectOneMenu ... value="#{myCompositeComponentBean.firstComboValue}" valueChangeListener="#{myCompositeComponentBean.yyy}"> <f:ajax event="valueChange" execute="@this" ... /> <f:selectItem itemLabel="Choose one .." noSelectionOption="true" /> <f:selectItems value="#{myCompositeComponentBean.firstComboList}" .... /> </h:selectOneMenu> <h:selectOneMenu ... value="#{myCompositeComponentBean.secondComboValue}" valueChangeListener="#{myCompositeComponentBean.bbb}"> <f:selectItem itemLabel="Choose one .." noSelectionOption="true" /> <f:selectItems value="#{myCompositeComponentBean.secondComboList}" .... /> </h:selectOneMenu>
而复合组件的JSF Bean将如下所示:
// this model will serve the composite component @Named @Scope("view") public class MyCompositeComponentBean { private String firstComboValue,secondComboValue; private List<String> firstComboList,secondComboList; ... }
这是Page1.xhtml的一个例子:
.... main department : <my:comboChainComponent /> <!-- 2 select items will be rendered here --> secondary department : <my:comboChainComponent /> <!-- another 2 select items will be rendered here --> ....
而Page1Bean(用于Page1.xhtml的主要JSF Bean)
@Named @Scope("view") public class Page1Bean { // inject the first bean for the composite component 1 @Inject private MyCompositeComponentBean bean1; @Inject private MyCompositeComponentBean bean2; ... }
是否可以实现这种可重用性?
谢谢.
解决方法
为什么不使用这种方法.
<mytag:combo id="combo1" value="#{bean.firstData}" model="#{globalBean.getList()}" update="form1:combo2" /> <mytag:combo id="combo2" value="#{bean.secondData}" model="#{globalBean.getSubList(bean.firstData)}" />
您可以使用复合属性.
... <composite:interface name="combo"> ... define your attributes here </composite:interface> <composite:implementation> <p:outputPanel id="content"> <p:selectOneMenu id="select_menu_1" value="#{cc.attrs.value}"> <f:selectItems value="#{cc.attrs.model}" /> <p:ajax event="change" process="@this" update="#{cc.attrs.update}" /> //add converter if you want </p:selectOneMenu> </p:outputPanel> </composite:implementation>
最好的祝福.