2010-07-14 16 views
10

Creé un enlace con texto estático. Eso funciona bien, pero ahora también quiero cambiar el texto cuando haces clic en el enlace.¿Cómo cambio el texto de enlace en Wicket?

que llegaron hasta este:

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

espero que me puede dar un consejo fácil - Estoy muy nuevo en esto :)

Saludos Elias

Respuesta

18

El HTML:

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

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

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

El 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"))) 

     ); 

    } 

} 

que tienden a utilizar wicket: recipiente con el fin de no contaminar el HTML con elementos superfluos (el portillo: recipiente no será dictada en la producción)

+0

Buena explicación con toda la información requerida. –

8

se deberá realizar una copia del texto en el enlace con su propio modelo:

<a wicket:id="doAnything"> <span wicket:id="linktext"/> </a>

y en Java:

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

mejor aún si se utiliza un (Compuesto) PropertyModel y tienen un getLinktext() La función devuelve el texto, dependiendo del estado.

0

peatonal incorporada no puede cambiar el atributo de texto de su enlace, así, añadir un nuevo componente hTML para hacer el truco.

No estoy de acuerdo con esta filosofía, y prefiero dejarla al hombre de la situación: 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 esta manera no es necesario la etiqueta/span adicional dentro de su elemento <a>.

Puede modificar su texto de Java si lo necesita. Si no lo hace, simplemente hágalo desde javascript.

6

Ningún cambio en el código HTML necesario:

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

Gracias, esta es una buena solución. –

0

En nuestro proyecto Wicket 6 utilizamos algo así:

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

Este componente satisfacer nuestras necesidades.

0

utilice la etiqueta HTML como se indica a continuación para su enlace y establezca el texto en el archivo de propiedad de la clave para poder usarlo.

HTML:

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

propiedad:

label.LABLENAME  =YOUR OWN TEXT FOR LABLE! 

Java:

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

salida sería una etiqueta de enlace con el texto especificado en el archivo de propiedades. Simplemente cambie el texto correspondiente en propiedades al texto que desee.

+0

Gracias Smittey por hacerlo mejor :) –