【发布时间】:2011-04-28 10:35:22
【问题描述】:
我想要一个与模型绑定的可重用 ui 组件。
例如:
- 我有一个链接到另一个 selectonemenu 的 selectonemenu(如部门 -> 子部门)
- 希望将此作为复合组件
- 这个复合组件将被绑定到一个特定的 JSF Bean
如果我只使用一个复合组件,我认为这个想法是可行的。
但是如果我使用多个相同类型的compositeComponent,这将不起作用,因为compositeComponent 的JSF Bean 将是相同的(在本例中,我使用视图范围),并且将在一个或多个复合组件之间共享状态。
这是一个粗略的例子,说明了我的困惑。在本例中,Page1.xhtml(主要模型为 Page1Bean.java)使用了 2 个复合组件(由 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;
...
}
是否有可能实现这种可重用性?
谢谢。
【问题讨论】:
标签: java jsf jsf-2 primefaces