2010-07-14 10 views
10

Tôi đã tạo liên kết có văn bản tĩnh. Điều đó hoạt động tốt nhưng bây giờ tôi cũng muốn thay đổi văn bản khi bạn nhấp vào liên kết.Làm cách nào để thay đổi liên kết văn bản trong Wicket?

tôi đã như xa như thế này:

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

Tôi hy vọng bạn có thể cho tôi một số lời khuyên dễ dàng - Tôi thực sự mới đến này :)

Trân trọng Elias

Trả lời

18

HTML:

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

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

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

Các 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"))) 

     ); 

    } 

} 

tôi có xu hướng sử dụng wicket: container để không gây ô nhiễm HTML với các yếu tố không cần thiết (wicket: container sẽ không được được hiển thị trong sản xuất)

+0

Giải thích tốt với tất cả thông tin bắt buộc. –

8

bạn cần phải trả lại văn bản trong liên kết với mô hình riêng của mình:

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

và trong java:

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

tốt hơn nhưng nếu bạn sử dụng một (Compound) PropertyModel và có một getLinktext() hoạt động trở về văn bản, tùy thuộc vào nhà nước.

0

Wicket không thể thay đổi thuộc tính văn bản của liên kết của bạn, do đó, thêm thành phần html mới để thực hiện việc hack.

Tôi không đồng ý với triết lý này và muốn để nó cho người dùng của tình huống: 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(); 
    } 
}); 

Bằng cách này bạn không cần thêm nhãn/khoảng cách bên trong phần tử <a>.

Bạn có thể sửa đổi văn bản của mình từ java nếu cần. Nếu bạn không, chỉ cần làm điều đó từ javascript sau đó.

6

Không thay đổi html cần thiết:

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

Cảm ơn bạn, đây là một giải pháp tốt. –

0

Trong dự án Wicket 6, chúng tôi sử dụng một cái gì đó như thế:

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

Thành phần này đáp ứng nhu cầu của chúng tôi.

0

sử dụng thẻ HTML như sau cho liên kết của bạn và đặt văn bản trong tệp thuộc tính cho khóa để sử dụng.

HTML:

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

tài sản:

label.LABLENAME  =YOUR OWN TEXT FOR LABLE! 

Java:

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

Output sẽ là một nhãn liên kết với các văn bản quy định tại các tập tin bất động sản. Chỉ cần thay đổi văn bản tương ứng trong thuộc tính thành bất kỳ văn bản nào bạn muốn.

+0

Cảm ơn Smittey vì đã làm cho nó tốt hơn :) –