2016-08-12 3 views
2

J'ai un composant composite constitué principalement d'un composant selectManyCheckbox. Comme il doit être conçu de façon générique je passe selectItems, manutention, etc. ajax à partir du niveau d'appel à l'aideComment référencer un composant dans un composant composite lors de l'utilisation d'un convertisseur

<composite:insertChildren/> 

Cela fonctionne très bien pour la plupart des choses. Maintenant, j'ai besoin d'utiliser ce composant composite avec un convertisseur. Comme le convertisseur (une sorte de ListConverter d'Omnifaces) n'est pas nécessaire tout le temps (parfois je veux avoir la valeur des entités concrètes qui soutiennent les éléments sélectionnés, parfois je ne le fais pas), j'aimerais le passer dans les parties mentionnées précédemment (par exemple, selectItems, gestion des événements ajax). Pour cette raison, il est nécessaire d'utiliser l'attribut 'for' de la variable du convertisseur pour référencer le composant à l'intérieur du composant composite. Au moins c'est ce que je comprends.

Malheureusement, je n'ai aucune idée de la valeur à utiliser. Dois-je inclure le nom du composant composite (conteneur de dénomination)? Dois-je utiliser le clientId? J'ai essayé beaucoup de combinaisons mais le convertisseur n'a pas été invoqué. Dès que je mets l'étiquette du convertisseur dans la définition du composant composite, cela fonctionne.

Pour faciliter les choses, supposons que je donne les résultats suivants:

<composite:interface> 
    <composite:attribute name="value" required="true"/> 
</composite:interface> 

<composite:implementation> 
    [...] 
    <h:selectManyCheckbox id="#{cc.attrs.id}" value="#{cc.attrs.value}"> 
     <composite:insertChildren/> 
    </h:selectManyCheckbox> 
    [...] 
</composite:implementation> 

Ce composant doit être utilisé comme suit:

<my:selectManyCheckbox id="myComponent" value="..."> 
    <f:selectItems value="..."/> 
    <o:converter for="___" converterId="..."/> 
</my:selectManyCheckbox> 

Peut-être que quelqu'un peut me donner une idée quelle valeur donnée à l'attribut 'for'.

Répondre

2

J'ai trouvé moi-même la réponse. Vous pouvez utiliser les éléments suivants

<composite:interface> 
    <composite:attribute name="value" required="true"/> 
    <composite:editableValueHolder name="input_component"> 
</composite:interface> 

<composite:implementation> 
    [...] 
    <h:selectManyCheckbox id="input_component" value="#{cc.attrs.value}"> 
     <composite:insertChildren/> 
    </h:selectManyCheckbox> 
    [...] 
</composite:implementation> 

La partie importante est la balise editableValueHolder. De la page utilisant ce composant composite, vous pouvez maintenant utiliser

<o:converter for="input_component" converterId="id_of_converter" /> 

Ceci est la solution qui fonctionne pour moi. J'espère que cela aide les autres ayant le même problème.