在Wicket应用程序中,我有一堆<button>
元素,我正在攻击Link
组件。现在在组件的onClick()
方法中我想禁用或更改按钮的样式。我怎样才能做到这一点?致电setEnabled(false)
无效。
答案 0 :(得分:9)
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()方法中添加它们,它们将在每次点击的同一链接上开始堆叠 - 因为它们是作为Link的一部分进行维护的状态。
您的链接可以跟踪所有状态,允许您的onClick()方法通过重复点击启用/禁用/更改/等。
您还可以覆盖onBeforeRender(),isVisible()以及每次在页面上显示链接时运行的其他方法。无论您单击按钮多少次,构造函数,onConfigure()和其他只运行一次。
答案 1 :(得分:3)
我不认为这在Wicket中是一个完全好主意。当然它可以通过欺骗来完成,但它要么简单得多:
isEnabled()
方法以返回从表单/组件模型派生的值。AttributeModifier
,并使用模型返回上面派生的值。无论你选择哪个,原则是让Wicket“拉”渲染信息而不是明确地推送它。
答案 2 :(得分:2)
Michael Borgwardt提供的答案几乎是正确的。
问题是您使用链接。已禁用的链接使用
<span>
代替<a>/<button>
,默认情况下被<em>
包围。使用Button 组件将设置&#39;禁用&#39;元素中的属性。
我想补充一点,您需要使用HTML按钮元素而不是<a>
(链接)。原始答案可以是反驳,因为链接和按钮也存在于Wicket中。
答案 3 :(得分:0)
我认为AjaxCallDecorator应该是您需要用来禁用/更改按钮样式的类。
答案 4 :(得分:0)
查看SimpleAttributeModifier和AttributeAppender。根据您的实际要求,其中一个应该可以解决问题。 SimpleAttributeModifier添加或替换任何在wicket中具有预表示的HTML-Tag的属性(替换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>
答案 5 :(得分:0)
问题是您使用链接。已禁用的链接使用<span>
代替<a>/<button>
,默认情况下会被<em>
包围。
使用Button组件将在元素中设置'disabled'属性。