Me gustaría tener un componente ui reutilizable que esté vinculado al modelo.¿Cómo hacer un componente reutilizable en JSF?
Por ejemplo:
- tengo un selectonemenu que está encadenado a otro selectonemenu (como departamento -> subdepartamento)
- gustaría hacer de este un componente compuesto
- Este componente compuesto es va a estar vinculado a un JSF Bean específico
Creo que esta idea funciona si solo estoy usando un componente compuesto.
Pero esto no funcionará si hago uso de más de un compositeComponent del mismo tipo, ya que la de compositeComponent JSF frijol será el mismo (en este ejemplo, im utilizando la vista alcance), y compartirá el estado entre uno o más CompositesComponents.
Este es un ejemplo aproximado que ilustra mi confusión. En este caso, Page1.xhtml (con el modelo principal de Page1Bean.java), hace uso de 2 compositeComponents (que es manejado por el JSF haba de MyCompositeComponent.java)
El componente compuesto será algo como:
<!-- 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>
Y del componente compuesto JSF frijol será como:
// this model will serve the composite component
@Named
@Scope("view")
public class MyCompositeComponentBean {
private String firstComboValue, secondComboValue;
private List<String> firstComboList, secondComboList;
...
}
Este es un ejemplo de 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 -->
....
Y el Page1Bean (JSF principal de la haba por 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;
...
}
¿Es posible lograr este tipo de reutilización?
Gracias.
Hola, gracias por la respuesta. Todavía no tengo las dificultades técnicas para desarrollar un componente compuesto, pero se trata más de cómo hacer que este componente compuesto sea reutilizable junto con JSF Bean, que se puede usar varias veces en una sola página. – bertie
Hola Albert, puedes utilizar el componente compuesto como la masa que quieras en una sola página (incluso si realmente no entiendo la necesidad). –