Как отключить / изменить стиль ссылки кнопки калитки в onClick () - PullRequest
4 голосов
/ 07 мая 2011

В приложении Wicket у меня есть набор <button> элементов, на которые я атакую ​​компонент Link. Теперь в методе компонента onClick() я хочу отключить или изменить стиль кнопки. Как я могу это сделать? Вызов setEnabled(false) не имеет никакого эффекта.

Ответы [ 6 ]

9 голосов
/ 08 мая 2011

Повторное использование onClick () работает с одним и тем же объектом в памяти.Если вы не используете Ajax, вы все равно можете поддерживать некоторое состояние в анонимном подклассе Link.Затем вы можете использовать onBeforeRender () и onComponentTag (), чтобы изменить способ его отображения каждый раз.

Link<Void> link = new Link<Void>("myLink") {

    private String customCSS = null;
    private boolean customEnabled = true;

    public void onClick() {
        if (/* test to determine disabled */) {
            customCSS = "disabled";
            customEnabled = false;
        } else {
            customCSS = null;
            customEnabled = true;
        }
    }

    @Override
    protected void onComponentTag(ComponentTag tag) {
        super.onComponentTag(tag);
        if (customCSS != null)
            tag.put("class", customCSS);
    }

    @Override
    public boolean isEnabled() {
        return super.isEnabled() && customEnabled;
    }
};

AttributeModifiers (или другие варианты поведения) не подходят для этого случая, потому что, если вы добавите их вметод onClick (), они начнут накладываться на одну и ту же ссылку для каждого клика - поскольку они поддерживаются как часть состояния ссылки.

Ваша ссылка может отслеживать все типы состояния, позволяя вашему onClick () метод для включения / отключения / изменения / и т. д. с повторными щелчками.

Вы также можете переопределить onBeforeRender (), isVisible () и другие методы, которые запускаются каждый раз, когда ссылка отображается на странице.Конструктор, onConfigure () и другие запускаются только один раз, независимо от того, сколько раз вы нажали кнопку.

3 голосов
/ 08 мая 2011

Я не думаю, что это хорошая идея в Wicket.Конечно, это может быть сделано путем обмана, но гораздо проще:

  1. Переопределить метод isEnabled(), чтобы получить значение, полученное из модели формы / компонента.
  2. Прикрепите AttributeModifier при создании компонента и используйте для него модель, которая возвращает значение, полученное, как указано выше.

В зависимости от того, что вы выберете, принцип состоит в том, чтобы позволить Wicket "вытягивать" информацию о визуализациивместо того, чтобы толкать его явно.

2 голосов
/ 08 марта 2017

Ответ, предоставленный Майклом Боргвардтом , почти правильный.

Проблема в том, что вы используете Link. Отключенные ссылки используют <span> вместо <a>/<button> и по умолчанию окружены <em>. Используя кнопку Компонент установит атрибут «disabled» в элементе.

Я хотел бы добавить, что вам нужно использовать элемент кнопки HTML вместо <a> (ссылка). Оригинальный ответ может быть обманчивым, потому что Link и Button также существуют в Wicket.

0 голосов
/ 07 мая 2011

Проблема в том, что вы используете Link.Отключенные ссылки используют <span> вместо <a>/<button> и по умолчанию заключены в <em>.Использование компонента Button установит атрибут «disabled» в элементе.

0 голосов
/ 07 мая 2011

Взгляните на SimpleAttributeModifier и AttributeAppender .В зависимости от ваших реальных требований один из них должен сделать свое дело.SimpleAttributeModifier добавляет или заменяет атрибут любого HTML-тега, который имеет предварительное представление в калитке (заменяет класс css), в то время как AttributeAppender добавляет атрибуты (добавляет другой класс css).Это должно работать и для включения / выключения кнопок, но я не пробовал этого.

Пример:

Label label = new Label("id", "Some silly text.")
add(label);
label.add(new SimpleAttributeModifier("class", "my-css-class");

Для Ajax вам также нужно добавить компонент к цели.

Более подробный пример:

Java-код:

import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.Model;

public class DemoPage extends WebPage {

    public DemoPage() {
        Form form = new Form("form");
        add(form);
        final WebMarkupContainer wmc = new WebMarkupContainer("greenText");
        form.add(wmc);
        form.add(new Link("redLink"){

            @Override
            public void onClick() {
                wmc.add(new SimpleAttributeModifier("class", "redText"));
            }});
        final Button boldButton = new Button("boldButton"){

            @Override
            public void onSubmit() {
                wmc.add(new AttributeAppender("class", true, new Model<String>("boldText"), " "));
            }};
        form.add(boldButton);
        Link disabler = new Link("buttonDisabler") {

            @Override
            public void onClick() {
                boldButton.add(new AttributeAppender("disabled", true, new Model<String>("disabled"), " "));                
            }

        };
        form.add(disabler);
    }

}

соответствующий HTML:

<html>
<head>
<style>
.redText {
    color: red;
    }
.greenText {
    color: green;
    }
.boldText {
    font-weight: bold;
    }
</style>
</head>
<body>
<form wicket:id="form">
<div class="greenText" wicket:id="greenText">This is Green.</div><br />
<a href="" wicket:id="redLink">Make it red</a><br />
<input type="submit" wicket:id="boldButton" value="Make it bold" /><br />
<a href="" wicket:id="buttonDisabler">Disable the button</a>
</form>
</body>
</html>
0 голосов
/ 07 мая 2011

Я думаю, что AjaxCallDecorator должен быть классом, который вы должны использовать, чтобы отключить / изменить стиль кнопки.

...