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