我想拥有一个与模型绑定的可重用UI组件。如何在JSF中创建可重用组件?
例如:
- 我有一个链接到另一个selectOneMenu用于一个selectOneMenu用于(如部门 - >子部门)
- 想使之成为一个复合材料部件
- 这种复合组件将被绑定到特定的JSF豆
我认为这个想法的作品,如果即时通讯只使用一个compositeComponent。
但是,如果我使用相同类型的多个compositeComponent的,这不会起作用,因为compositeComponent的JSF豆将是相同的(在这个例子中,即时通讯使用的视图范围内),并且将共享状态在一个或多个复合组件之间。
这是一个粗略的例子,说明了我的困惑。在这种情况下,Page1.xhtml(与Page1Bean.java的主模型),利用了2个compositeComponents(其由MyCompositeComponent.java的JSF豆处理)
的复合元件将是这样的:
<!-- 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豆会像:
// 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(JSF主要为豆Page1.xhtml)
@Named
@Scope("view")
public class Page1Bean {
// inject the first bean for the composite component 1
@Inject private MyCompositeComponentBean bean1;
@Inject private MyCompositeComponentBean bean2;
...
}
是否有可能实现这种重用的?
谢谢。
你好,谢谢你的回复。我还没有开发复合组件的技术困难,但更重要的是如何使这个复合组件可重复使用以及它的耦合JSF Bean,它可以在单个页面中多次使用。 – bertie 2011-04-28 12:23:15
嗨,阿尔伯特,你可以在单个页面中使用复合组件(尽管我不太了解需求)。 – 2011-04-28 14:39:27