JSF 2.0: Pourquoi se crée un haricot JSF quand il est utilisé dans un composant qui n'est pas rendu?

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

Question

Ayons une composante composite extrêmement simple:

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

Bean pour elle:

public class TestBean {

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

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

}

Ensuite, appelez comme d'habitude, mais ne montrent pas:

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

Qu'est-ce qui se passe est que le composant est jamais rendu et le haricot est jamais lancé comme on suppose.

Cependant, si l'on change le composant comme:

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

Qu'est-ce qui se passe est que le composant obtient toujours jamais rendu (parce que l'attribut rendered est false), cependant, le haricot ne soit instancié. Cela se produit toujours lorsque nous utilisons une propriété de haricots dans certains composants JSF natif (h:panelGroup, h:inputHidden, peu importe).

Pourquoi est-il?

Était-ce utile?

La solution

Les composants (et tous les haricots liés) sont créées pendant la construction de la vue. L'attribut rendu est évaluée uniquement pendant la vue du rendu. Il a toujours travaillé de cette façon dans JSF.

Si le grain est en train de faire un certain travail coûteux pendant la construction, alors je vous suggère de laisser ce travail coûteux dépendent de la certaine condition que vous réutiliser ensuite dans l'attribut rendu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top