Я хотел бы иметь многоразовый компонент пользовательского интерфейса, привязанный к модели.
Например:
Я думаю, что эта идея работает, если я использую только один составной компонент.
Но это не сработает, если я использую более одного композитного компонента одного и того же типа, поскольку компонент JSF композитного компонента будет таким же (в этом примере я использую область просмотра) и будет разделять состояние между одним или несколькими составными компонентами.
Это один грубый пример, который иллюстрирует мою путаницу. В данном случае Page1.xhtml (с основной моделью Page1Bean.java), использует 2 составных компонента (которые обрабатываются JSF-компонентом 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-компонент составного компонента будет иметь вид:
// 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;
...
}
Можно ли добиться такого повторного использования?
Спасибо.