JSF 2.0: ¿Por qué un grano de JSF se crean cuando se utiliza en un componente que no se rinde?

StackOverflow https://stackoverflow.com/questions/4214457

Pregunta

Vamos a tener un componente compuesto extremadamente simple:

<cc:implementation>
    #{testBean.someField}
</cc:implementation>

haba por él:

public class TestBean {

    private boolean someField = false;
    public boolean getSomeField() { return someField; }

    @PostConstruct
    public void init() {
        System.out.println("PostConstruct");
    }

}

A continuación, llamar como de costumbre, pero no lo demuestran:

<codeEditor:test rendered="#{false}" />

Lo que sucede es que el componente no se rinde y el grano no se inicia, como es de suponer.

Sin embargo, si cambiamos el componente como:

<cc:implementation>
    <h:outputText value="#{testBean.someField}" />
</cc:implementation>

Lo que sucede es que el componente todavía nunca se rindió (porque el atributo rendered es false), sin embargo, el grano se vuelve a crear instancias. Esto ocurre siempre cuando usamos una propiedad de bean dentro de alguno de los componentes JSF nativa (h:panelGroup, h:inputHidden, lo que sea).

¿Por qué es así?

¿Fue útil?

Solución

Los componentes (y todos los granos unidos) se crean durante el tiempo de vista de construcción. El atributo dictada sólo se evalúa durante la visualización en tiempo de renderizado. Siempre ha trabajado de esa manera en JSF.

Si el grano está haciendo un trabajo caro durante la construcción, entonces yo sugeriría que dejar ese trabajo caro depende de la condición alguna que luego reutilización en el atributo prestado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top