动态地使用将类添加到AttributeAppender代码中的组件中非常简单
component.add(new AttributeAppender("class", true, new Model<String>("foo"), " "));或者,如果您已经将上面的内容提取到一个适当的实用程序方法或类中,那么只需这样做:
component.add(WicketUtils.cssClassAppender("foo"));,但我如何删除CSS类?
通过完全清除class属性,您可以轻松地删除所有CSS类:
component.add(new SimpleAttributeModifier("class", ""));如果组件有您不希望删除的其他CSS类,则不能接受...but。
Wicket1.4(但也可以随意发布针对以后版本的建议)。
发布于 2012-04-13 05:45:14
我想出了一个办法:
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子类,但是将逻辑放在单独的实用程序类或方法中可以清理它很多。)
编辑:一个改进的newValue()版本,它更好地处理角落案例(参见biziclop的评论)。注:使用番石榴。(欢迎您发布更简单的帖子(regex?)(版本)
@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);
}发布于 2015-05-08 13:28:41
在乔尼克的回答的基础上,下面添加了负前瞻性,以忽略不同样式类中间出现的事件(并且不区分大小写)。
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
发布于 2012-04-13 14:24:57
Wicket 1.5+有org.apache.wicket.AttributeModifier#remove()
https://stackoverflow.com/questions/10135791
复制相似问题