在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>
由于
答案 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邮件列表的人肯定会想出一些更优雅的东西......
享受。