java – 如何使JSF中的可重用组件?
|
我想有一个可重用的ui组件,与模型有关. 例如 : >我有一个选择菜单链接到另一个选择菜单(像部门 – >子部门) 我认为这个想法是有效的,如果我只使用一个复合组件. 但是,如果我使用同一类型的多个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>
最好的祝福. (编辑:鄂州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
