2010-10-18 6 views
0

J'implémente l'interface Wicket IBehavior et je souhaite que mon comportement change le corps d'un composant (ou mette à jour le modèle) à partir de la méthode onComponentTag. Existe-t-il un moyen de le faire?Wicket: modification du corps du composant depuis IBehavior :: onComponentTag

@Override 
public void onComponentTag(final Component component, final ComponentTag tag) 
{ 
    String myValue = tag.getAttribute("myAttribute"); 

    // TODO: Based on the value of this attribute, update the body/model of the component 


    super.onComponentTag(component, tag); 
} 

Modifier: Je voudrais saisir un attribut dans le code HTML qui spécifie le nombre maximal de caractères autorisés pour l'élément puis tronquer le programme corps de l'élément si nécessaire.

Exemple:

<span wicket:id="myLabel" maxChars="10">The body of my tag</span> 

serait remplacé par:

<span wicket:id="myLabel" maxChars="10">The bod...</span> 

Répondre

2

Vous pourriez être en mesure de le faire en obtenant le modèle du composant, obtenir l'objet du modèle et de faire tous les changements vous avez besoin de l'objet, mais onComponentTag n'est pas le meilleur endroit pour travailler qui change le modèle.

Cette méthode est appelée pendant le processus de rendu, à un moment où votre page a été partiellement rendue. Toute partie de la page qui a déjà été rendue aura été rendue avec l'état antérieur du modèle. Comme les modèles peuvent être partagés entre les composants, la page résultante peut être incohérente.

Si vous essayez de changer le corps rendu, c'est une autre histoire, et un travail parfaitement raisonnable à faire dans cette méthode. Cela implique généralement l'appel de méthodes sur le paramètre ComponentTag tag.

Quel est le problème que vous essayez de résoudre en créant ce comportement? Peut-être pouvons-nous penser à un meilleur moyen.

EDIT:

Pour le cas particulier de la coupe de l'affichage sur une étiquette, vous êtes probablement mieux servis par le sous-classement simplement le composant Label approximativement comme suit:

public class TrimmedLabel extends Label { 
    private int size; 

    public TrimmedLabel(String id, int size) { 
     super(id); 
     this.size = size; 
    } 

    public TrimmedLabel(String id, String label, int size) { 
     super(id, label); 
     this.size = size; 
    } 

    public TrimmedLabel(String id, IModel model, int size) { 
     super(id, model); 
     this.size = size; 
    } 

    @Override 
    protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { 
     String value = getModelObjectAsString(); 
     if (value.length() > size) { 
      value = value.substring(0, size); 
     } 
     replaceComponentTagBody(markupStream, openTag, value); 
    } 
} 
+0

Je veux spécifier le nombre maximal de caractères autorisés pour le corps de l'étiquette dans le code HTML, puis saisir cette valeur et éventuellement tronquer le texte. – Clayton

+0

J'espérais encapsuler cette fonctionnalité dans un comportement qui pourrait être appliqué à une variété de composants, mais d'après mes recherches, je ne pense pas que ce soit possible. – Clayton

2

dérivé de la Quickstart http://wicket.apache.org/start/quickstart.html ma suggestion devrait ressembler à ceci:

add(new Label("message", "If you see this message wicket is properly configured and running") { 

     @Override 
     protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { 
      String myAttrib = openTag.getAttribute("myAttrib"); 
      replaceComponentTagBody(markupStream, openTag, getDefaultModelObjectAsString().substring(0, Integer.valueOf(myAttrib))); 
     } 

    }); 

Ne pas oublier de regarder NumberFormat Exc eptions cependant.

Aussi les suggestions de donroby font tout. Ne plaisante pas avec le modèle si ce n'est pas nécessaire.

+0

+1: Cela peut être plus courant que le mien, car je travaillais depuis une installation Wicket 1.3. –

Questions connexes