使用 AttributeAppender 动态地 add CSS 类到 Java 代码中的组件是非常简单的:
component.add(new AttributeAppender("class", true, new Model<String>("foo"), " "));
或者,如果您已将上述内容提取到适当的实用方法或类中,则只需类似:
component.add(WicketUtils.cssClassAppender("foo"));
但是如何删除 CSS 类?
您可以通过完全清除 class 属性来轻松删除所有 CSS 类:
component.add(new SimpleAttributeModifier("class", ""));
...但是如果组件具有您不希望删除的其他 CSS 类,则这是不可接受的。
Wicket 1.4(但也可以随意发布针对更高版本的建议)。
这是我想出的一种方法:
public class CssClassRemover extends AttributeModifier {
public CssClassRemover(String cssClass) {
super("class", false, new Model<String>(cssClass));
}
@Override
protected String newValue(String currentValue, String valueToRemove) {
// NB: naive approach; breaks with e.g. "foo foo-bar" & "foo"
return currentValue.replaceAll(valueToRemove, "");
}
}
使用上述助手的代码将是:
component.add(new CssClassRemover("foo"))
(当然,您也可以根据需要创建匿名 AttributeModifier 子类,但是将逻辑放在单独的实用程序类或方法中可以使其清理很多。)
Edit:
newValue()
的改进版本,可以更好地处理极端情况(请参阅biziclop的评论)。注意:使用Guava。 (欢迎您发布更简单的(正则表达式?)版本。)
@Override
protected String newValue(String currentValue, String valueToRemove) {
if (currentValue == null) return "";
Set<String> classes = Sets.newHashSet(Splitter.on(" ").split(currentValue));
classes.remove(valueToRemove);
return Joiner.on(" ").join(classes);
}
基于 Jonik 的答案,以下添加了负向前瞻以忽略不同样式类中间的出现(并且不区分大小写)。
public class StyleClassRemover extends AttributeModifier {
public StyleClassRemover(final String cssClass) {
super("class", false, Model.of(cssClass));
}
@Override
protected String newValue(final String currentValue, final String valueToRemove) {
if (currentValue == null) {
return "";
}
final String patternString = "(^|\\s+)" + Pattern.quote(valueToRemove) + "(?!\\S)";
return Pattern.compile(patternString, Pattern.CASE_INSENSITIVE).matcher(currentValue).replaceAll("");
}
}
测试输入: http://fiddle.re/ah0ca6
Wicket 1.5+ 有 org.apache.wicket.AttributeModifier#remove()
不确定何时引入,但 Wicket 有 ClassAttributeModifier()
component.add(new ClassAttributeModifier() {
@Override
protected Set<String> update(Set<String> oldClasses) {
return oldClasses
.stream()
.filter(c -> !"foo".equals(c))
.collect(Collectors.toSet());
}
});