Wicket AttributeModifier для AjaxLink - PullRequest
       1

Wicket AttributeModifier для AjaxLink

2 голосов
/ 31 августа 2010

В калитке AttributeModifier не меняет атрибут «класс» для AjaxLink. Он должен изменить атрибут класса и изменить внешний вид ссылки.

public class TestPage extends WebPage {
    private AjaxLink link1;
    private AjaxLink link2;

    public TestPage() {
        super();

        link1 = new AjaxLink("link1") {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
                switchView("view1");
            }
        };

        link2 = new AjaxLink("link2") {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
                switchView("view2");
            }
        };

        link1.setOutputMarkupId(true);
        link2.setOutputMarkupId(true);

        link1.add(new AttributeModifier("class", true, new Model<String>("active")));
        link2.add(new AttributeModifier("class", true, new Model<String>("inactive")));

        add(link1);
        add(link2);
    }

    private void switchView(String viewName) {
        if (viewName.equals("view1")) {
            link1.add(new AttributeModifier("class", true, new Model<String>("active")));
            link2.add(new AttributeModifier("class", true, new Model<String>("inactive")));
        } else if (viewName.equals("view2")) {
            link1.add(new AttributeModifier("class", true, new Model<String>("inactive")));
            link2.add(new AttributeModifier("class", true, new Model<String>("active")));
        }
    }
}

Соответствующий HTML-файл выглядит так:

<html xmlns:wicket>
<body>
<wicket:extend>
 <div id="tabs">
 <ul>
  <li><a wicket:id="link1">View1</a></li>
  <li><a wicket:id="link2">View2</a></li>
 </ul>
 </div>
</wicket:extend>
</body>
</html>

Спасибо

Ответы [ 2 ]

4 голосов
/ 31 августа 2010

На самом деле вы не говорите калитке что-либо делать в ответе ajax.

Вероятное исправление - добавить строки:

target.addComponent(link1);
target.addComponent(link2);

(или вызов функции, выполняющей это) для обоих ваших методов onClick.

3 голосов
/ 02 сентября 2010

Правильный ответ уже дан, вы должны добавить компоненты к AjaxTarget. Тем не менее, ради создания большего количества "Wickety" кода, вы можете переписать ваш класс примерно так:

public class TestPage extends WebPage {
    private AjaxLink link1;
    private AjaxLink link2;

    public TestPage() {
        super();

        final Model<Boolean> link1Model = new Model<Boolean>(Boolean.True);
        final Model<Boolean> link2Model = new Model<Boolean>(Boolean.False);

        link1 = new AjaxLink<Boolean>("link1", link1Model) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
                this.getModel().setObject(!this.getModel().getObject());
                target.addComponent(this);
            }
        };

        link2 = new AjaxLink<Boolean>("link2", link2Model) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
                this.getModel().setObject(!this.getModel().getObject());
                target.addComponent(this);
            }
        };

        link1.setOutputMarkupId(true);
        link2.setOutputMarkupId(true);

        link1.add(new AttributeModifier("class", true, new Model<String>() {
           public String getObject() {
              return link1Model.getObject() ? "active" : "inactive";
           }
        }));
        link2.add(new AttributeModifier("class", true, new Model<String>() {
           public String getObject() {
              return link1Model.getObject() ? "active" : "inactive";
           }
        }));

        add(link1);
        add(link2);
    }
}

Используются модели, что рекомендуется в Wicket. Тем не менее, там происходит тяжелое дублирование кода, поэтому я мог бы предложить перейти к отдельному компоненту:

public final class ActiveInactiveLink extends AjaxFallbackLink<Boolean> {
    public ActiveInactiveLink(String id) {
        super(id, new Model<Boolean>(Boolean.True));
        this.add(new AttributeModifier("class", true, new Model<String>() {
            public String getObject() {
               Model<Boolean> model = ActiveInactiveLink.this.getModel();
               return model.getObject() ? "active" : "inactive";
            }
         }));
         this.setOutputMarkupId(true);
    }

    @Override
    public void onClick(AjaxRequestTarget target) {
       this.getModel().setObject(!this.getModel().getObject());
       target.addComponent(this);
    }

    @Override
    public void setModel(IModel<Boolean> model) {
        if(model == null)
           return;
        this.model = model;
    }

 }

 public class TestPage extends WebPage {
        private AjaxLink link1;
        private AjaxLink link2;

        public TestPage() {
            link1 = new ActiveInactiveLink("link1");
            link2 = new AjaxLink<Boolean>("link2");

            add(link1);
            add(link2);
        }
    }

Все это, конечно, не проверено и не скомпилировано, поэтому никаких гарантий. :)

Кроме того, ребята из списка рассылки Wicket наверняка придут к чему-то более элегантному ...

Наслаждайтесь.

...