2010-07-14 8 views
10

J'ai créé un lien avec du texte statique. Cela fonctionne bien, mais maintenant je veux aussi changer le texte lorsque vous cliquez sur le lien.Comment modifier le texte d'un lien dans Wicket?

j'ai eu pour autant que cela:

add(new Link("doAnything") { 
    @Override 
    public void onClick() { 
      // change the text! 
      // this.modelChanging(); 
      // this.detach(); 
    } 
}); 

J'espère que vous pouvez me donner quelques conseils faciles - Je suis vraiment nouveau à cette :)

Cordialement Elias

Répondre

18

Le code HTML:

<html><head></head><body> 
<wicket:panel> 

    <a href="" wicket:id="link"> 
     <wicket:container wicket:id="label" /> 
    </a> 

</wicket:panel> 
</body></html> 

Java:

public class MyPanel extends Panel{ 

    private static class Mybean{ 

     String labelText = "click me"; 

     public String getLabelText(){ 
      return this.labelText; 
     } 

     public void setLabelText(final String labelText){ 
      this.labelText = labelText; 
     } 

    } 

    public MyPanel(final String id){ 
     super(id); 
     final Mybean bean = new Mybean(); 
     this.add(new Link<Void>("link"){ 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void onClick(){ 
       bean.setLabelText("Thanks for clicking"); 
      } 
     }.add(new Label("label", new PropertyModel<String>(bean, "labelText"))) 

     ); 

    } 

} 

J'ont tendance à utiliser wicket: récipient afin de ne pas polluer le HTML avec des éléments superflus (le guichet: conteneur ne sera pas rendu en production)

+0

Bonne explication avec toutes les informations requises. –

8

vous besoin de sauvegarder le texte dans le lien avec son propre modèle:

et en java:

add(new Link("doAnything").add(new Label("linktext", Model.of("i 'm the text")); 

mieux encore si vous utilisez un (composé) PropertyModel et ont une fonction getLinktext() le rendement du texte, en fonction de l'état.

0

Wicket ne peut pas modifier l'attribut de texte de votre lien, donc, ajoutez un nouveau composant html pour faire le hack.

Je ne suis pas d'accord avec cette philosophie, et préfère laisser à l'homme de la situation: javascript.

add(new AjaxLink("doAnything") { 
    @Override 
    public void onClick(final AjaxTarget t) { 
      // change the text! 
      t.appendJavaScript("document.getElementById('idofyourlink').text = 'newtext';"); 
      // this.modelChanging(); 
      // this.detach(); 
    } 
}); 

De cette façon, vous n'avez pas besoin de l'étiquette/span supplémentaire dans votre élément <a>.

Vous pouvez modifier votre texte à partir de Java si vous en avez besoin. Si vous ne le faites pas, faites-le à partir de javascript alors.

6

Aucun changement au code HTML nécessaire:

Link link = new Link("doAnything") { 
    @Override 
    public void onClick() { 
      // change the text! 
      // this.modelChanging(); 
      // this.detach(); 
    } 
}); 
link.setBody(Model.of("visible link name")); 

add(link); 
+0

Merci, c'est une bonne solution. –

0

Dans notre projet, nous utilisons 6 Wicket quelque chose comme ça:

public abstract class AjaxLabeledLink extends AjaxLink { 

private IModel<String> text = new Model<>(); 

public AjaxLabeledLink(String string) { 
    super(string); 
    this.text = new Model<>(""); 
} 

public AjaxLabeledLink(String string, String linkText) { 
    super(string); 
    this.text = new Model<>(linkText); 
} 

public AjaxLabeledLink(String string, IModel<String> linkText) { 
    super(string); 
    this.text = linkText; 
} 

@Override 
public IModel<?> getBody() { 
    return text; 
} 

public IModel<String> getText() { 
    return text; 
} 

public void setText(IModel<String> text) { 
    this.text = text; 
} 
} 

Ce composant satisfaire nos besoins.

0

Utilisez la balise HTML comme suit pour votre lien et définissez le texte dans le fichier de propriétés pour la clé afin de l'utiliser.

HTML:

<a wicket:id="doAnything"><wicket:message key="label.LABLENAME" /></a> 

Propriété:

label.LABLENAME  =YOUR OWN TEXT FOR LABLE! 

Java:

add(new BookmarkablePageLink<YOURCLASS>(
      "doAnything", YOURCLASS.class))); 

sortie serait une étiquette de lien avec le texte spécifié dans le fichier de propriétés. Il suffit de changer le texte correspondant dans les propriétés pour le texte que vous voulez.

+0

Merci Smittey pour le rendre meilleur :) –

Questions connexes