2010-08-24 11 views
1

j'ai un composant composite, où je passe dans un attribut défini par l'arbitraire:JSF 2 - passage de paramètres accross événements système

<x:mycomp x="..."/> 

x étant définie en tant que telle dans la définition d'interface de l'cc. A l'intérieur de la mise en œuvre de mycomp J'ai un écouteur d'événement:

<composite:implementation> 
    <f:event type="preRenderComponent" listener="#{mycontroller.init}" /> 
</composite:implementation> 

Maintenant, je voudrais faire quelque chose sur le back-end avec ce paramètre x arbitraire. comment est-ce que je le passe à travers l'événement de système, comme avec un tag f:attribute? ou obtenir le composant source de l'événement et chalutage à travers ses internes? (en parlant de quoi dans l'UIComponent sont ces attributs stockés de toute façon - je ne pouvais pas les trouver, pas dans les attributs de toute façon).

Si cela n'est pas possible, cela limite considérablement l'utilité des événements système. Si vous placez le composant à l'intérieur d'un ui:repeat, l'auditeur est renvoyé plusieurs fois afin qu'il marche dans l'arborescence pendant le déclenchement de l'événement.

La seule chose que je peux penser est d'encoder init directement dans le rendu:

<composite:implementation> 
    #{mycontroller.init(cc.attrs.x)} //returns empty string 
    <!--f:event type="preRenderComponent" listener="#{mycontroller.init}" /--> 
</composite:implementation> 

Mais je pensais que c'est ce que serait un événement système de prerender pour.

+1

Désolé, j'ai lu votre question jusqu'à 3 fois, mais je n'arrive pas à filtrer/comprendre les exigences fonctionnelles sous-jacentes. Pouvez-vous s'il vous plaît mettre à jour votre question pour élaborer un peu plus? – BalusC

+0

wow, rapide! Je passe un attribut dans un composant composite. supposons qu'il doit être décoré d'une manière ou d'une autre avant d'être rendu. un événement système peut-il obtenir cet attribut 'x' afin de fonctionner avec lui sur le serveur? même chose que vous avez décrit dans votre site Web en ce qui concerne la transmission de paramètres via un programme d'action (si vous êtes la même personne http://balusc.blogspot.com/2006/06/communication-in-jsf.html), sauf cette fois c'est un eventlistener, pas un actionlistener. essentiellement je cherche un moyen d'initialiser les paramètres passés juste avant le rendu. –

Répondre

1

Peut-être que c'est un peu tard pour la réponse.

J'ai fait une preuve de concept de ce que je pense être le problème que vous essayez de résoudre. Pour le faire, vous devez sortir votre enregistrement d'événement et le faire dans la page d'utilisation de votre composite. Votre méthode init peut recevoir un ComponentSystemEvent qui vous donnera le composant composite et vous pourrez alors accéder à votre attribut 'x' à partir de la carte des attributs du composant.

Le code dans la page en utilisant quelque chose comme ceci:

<x:mycomp x="hola">
        <f:event type="preRenderComponent" listener="#{bean.init}"/>
</x:mycomp>

Et le code java:

public class MyBean { 
    private String value; 

    public void init(ComponentSystemEvent e){ 
     System.out.println("x: "+e.getComponent().getAttributes().get("x")); 
    } 

} 

je l'espère être utile (donc moi des mois plus tard).