Как изменить текст ссылки в Wicket?
Я создал ссылку со статическим текстом. Это прекрасно работает, но теперь я также хочу изменить текст при нажатии ссылки.
Я дошел до этого:
add(new Link("doAnything") {
@Override
public void onClick() {
// change the text!
// this.modelChanging();
// this.detach();
}
});
Надеюсь, вы можете дать мне легкий совет - я действительно новичок в этом:)
С уважением
Элиас
Ответы
Ответ 1
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")))
);
}
}
Я использую контейнер wicket: для того, чтобы не загрязнять HTML с лишними элементами (калитка: контейнер не будет отображаться в процессе производства)
Ответ 2
вам нужно вернуть текст в ссылку со своей собственной моделью:
<a wicket:id="doAnything">
<span wicket:id="linktext"/>
</a>
и в java:
add(new Link("doAnything").add(new Label("linktext", Model.of("i 'm the text"));
еще лучше, если вы используете (Compound) PropertyModel и имеете функцию getLinktext(), возвращает текст в зависимости от состояния.
Ответ 3
Не требуется внесение изменений в html:
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);
Ответ 4
Wicket не может изменить текстовый атрибут вашей ссылки, поэтому добавьте новый html-компонент для взлома.
Я не согласен с этой философией и предпочитаю оставить ее человеку ситуации: 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();
}
});
Таким образом вам не понадобится дополнительная метка/интервал внутри вашего элемента <a>
.
Вы можете изменить свой текст из java, если вам нужно. Если вы этого не сделаете, просто сделайте это из javascript.
Ответ 5
В нашем проекте Wicket 6 мы используем что-то вроде этого:
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;
}
}
Этот компонент удовлетворяет наши потребности.
Ответ 6
используйте тег HTML, как показано ниже для вашей ссылки, и укажите текст в файле свойств для ключа, чтобы использовать его.
HTML:
<a wicket:id="doAnything"><wicket:message key="label.LABLENAME" /></a>
Свойство:
label.LABLENAME =YOUR OWN TEXT FOR LABLE!
Java:
add(new BookmarkablePageLink<YOURCLASS>(
"doAnything", YOURCLASS.class)));
Вывод будет ярлыком ссылки с текстом, указанным в файле свойств.
Просто измените соответствующий текст в свойствах на любой текст, который вы хотите.