Я хотел бы иметь повторно используемый компонент ui, привязанный к модели.
Например:
- У меня есть selectonemenu, который прикован к другому selectonemenu (например, отдел → подразделение).
- Хотелось бы сделать это составным компонентом
- Этот составной компонент будет привязан к определенному JSF Bean
Я думаю, что эта идея работает, если im использует только один составной компонент.
Но это не сработает, если я использую более одного составного компонента того же типа, так как составной составной JSF Bean будет тем же самым (в этом примере im использует область просмотра), и будет делиться состоянием между одним или несколькими составными компонентами.
Это один пример, иллюстрирующий мое замешательство. В этом случае Page1.xhtml(с основной моделью Page1Bean.java) использует 2 составных компонента (которые обрабатываются JSF Bean MyCompositeComponent.java)
Компонентный компонент будет выглядеть примерно так:
<!-- 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;
...
}
Это пример страницы1.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 Bean для 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;
...
}
Возможно ли достичь такого повторного использования?
Спасибо.