8
votes

JSF2.0 - Composant composit composé avec expression de méthode facultative

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.

Ici mon code: < Pré> xxx

Lorsque vous l'utilisez, je n'ai pas spécifié l'attribut "ActionMethod". Comme ceci: xxx

mais je reçois le message d'erreur: xxx

existe un moyen de faire cela?


2 commentaires

Vous pouvez transmettre l'attribut facultatif à actionlistener . Qu'est-ce que vous utilisez votre cas, que pensez-vous qu'il devrait arriver lorsque ActionListener n'est pas résolu et CommandLink 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.


5 Réponses :


10
votes

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>


0 commentaires

3
votes

Une autre solution consiste à créer un propre type de composant, avec une méthode d'action. Exemple: xxx

et le composanttype doit ressembler à: xxx


0 commentaires

1
votes

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 "";
    }

}


0 commentaires

7
votes

Modifiez le type de retour de la signature de la méthode à java.lang.Object et ajoutez "null" comme valeur par défaut. xxx pré>

sans méthode: p>

<util:foo actionMethod="#{someBean.someMethod()}" namePrompt="SomeName" showComponent="true"/>


0 commentaires

0
votes

É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: xxx pré>

et la mise en œuvre: p>

<composite:implementation>
   <div>
      <p:commandLink 
         actionListener="#{cc.attrs.classWithMethod.actionMethod}">    
      </p:commandLink>
   </div>
</composite:implementation>


0 commentaires