Je suis implémentant un composant composite et j'ai trouvé un problème que je n'ai trouvé pas de solution.
J'ai spécifié ses attributs qui peuvent ou non être transmis par l'auteur de la page, mais je ne pouvais pas spécifier une méthode Attribut (une expression méthode à l'action) qui, s'il n'a pas été passé, le composant composite n'utilise pas l'attribut méthode dans la balise de mise en oeuvre Composite: la balise de mise en œuvre. p>
Ici mon code: P> < Pré> xxx pré>
Lorsque vous l'utilisez, je n'ai pas spécifié l'attribut "ActionMethod". Comme ceci: p> mais je reçois le message d'erreur: p> existe un moyen de faire cela? p> p>
5 Réponses :
Vous devrez créer deux P: CommandLink CODE> Éléments et le rendant de manière conditionnelle en fonction de la définition de votre paramètre:
<p:commandLink actionListener="#{cc.attrs.actionMethod}" rendered="#{!empty cc.getValueExpression('actionMethod') and cc.attrs.showComponent}">
<h:outputText value="#{cc.attrs.namePrompt}"/>
</p:commandLink>
<p:commandLink rendered="#{empty cc.getValueExpression('actionMethod')}">
<h:outputText value="#{cc.attrs.namePrompt}"/>
</p:commandLink>
Une autre solution consiste à créer un propre type de composant, avec une méthode d'action. Exemple: et le composanttype doit ressembler à: p>
avait la même erreur exacte et nécessaire pour avoir une méthode d'action optionnelle sur mon composant également.
J'ai donc essayé d'ajouter un paramètre par défaut sur l'attribut composite avec la signature méthode, pointant sur une méthode sur le visage correspondantchon classe et cela fonctionne bien! p>
Composant: P>
@FacesComponent("myButton") public class MyButton extends UINamingContainer { public MyButton () { } public String dummyAction() { return ""; } }
Modifiez le type de retour de la signature de la méthode à java.lang.Object et ajoutez "null" comme valeur par défaut. sans méthode: p> <util:foo actionMethod="#{someBean.someMethod()}" namePrompt="SomeName" showComponent="true"/>
Évitez de mettre des méthodes à l'intérieur du composite. Si vous devez le faire, placez la classe qui dispose de la méthode à l'intérieur du composite et utilisez-la comme ceci: et la mise en œuvre: p> <composite:implementation>
<div>
<p:commandLink
actionListener="#{cc.attrs.classWithMethod.actionMethod}">
</p:commandLink>
</div>
</composite:implementation>
Vous pouvez transmettre l'attribut facultatif à
actionlistener code>. Qu'est-ce que vous utilisez votre cas, que pensez-vous qu'il devrait arriver lorsque
ActionListener CODE> n'est pas résolu et
CommandLink code> est rendu?
Oui, le composant de liaison est rendu, mais lorsque l'action du clic se produit dans le composant de liaison, il se plaint que je n'ai pas défini une méthode d'action de l'Attribut ActionMethod. Mais c'est mon intention, parfois je ne veux pas définir une méthode d'action pour l'attribut ActionMethod. Est-ce possible? Je pensais mettre le "nécessaire = faux" résoudre le problème.