用于AjaxLink的Wicket AttributeModifier

时间:2010-08-31 11:12:10

标签: java wicket

在wicket中,AttributeModifier不会更改AjaxLink的属性“class”。它应该改变类属性并改变链接的样子。

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 个答案:

答案 0 :(得分:4)

你实际上并没有告诉wicket在ajax响应中做任何事情。

可能的解决方法是添加以下行:

target.addComponent(link1);
target.addComponent(link2);
两个onClick方法的

(或对这样做的函数的调用)。

答案 1 :(得分:3)

已经给出了正确答案,您必须将组件添加到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邮件列表的人肯定会想出一些更优雅的东西......

享受。