2012-04-13 52 views
14

这是非常简单的使用AttributeAppender动态添加 CSS类到组件中的Java代码:如何从Wicket组件中删除CSS类?

component.add(new AttributeAppender("class", true, new Model<String>("foo"), " ")); 

或者,如果你已经提取以上到合适的实用方法或类,只需像:

component.add(WicketUtils.cssClassAppender("foo")); 

但我怎么能删除一个CSS类?

您可以轻松地通过清除类属性完全去除所有 CSS类:

component.add(new SimpleAttributeModifier("class", "")); 

...但如果组件,你做希望其他CSS类,是不能接受的去除。

Wicket 1.4(但也可随时发布针对更高版本的建议)。

+3

没有用的,嗯 - 护理阐述,downvoter?恕我直言,这对于我自己和其他人来说很有用,可以在SO上记录Wicket的非直接明显的方面。 – Jonik 2012-04-13 07:22:20

回答

17

这里有一种方法,我想出了:

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, ""); 
    } 
} 

使用上述助手,那么将是代码:(当然你也可以只创建匿名AttributeModifier子类需要

component.add(new CssClassRemover("foo")) 

,但将逻辑放在单独的实用程序类别或方法中会使其清理很多)。

编辑:改进的版本newValue()更好地处理转角情况(参见biziclop的评论)。 NB:使用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); 
} 
+0

**随意张贴更好/更简单的方法来做到这一点**特别是,如果我忽略了内置的Wicket自带的这样的东西...... – Jonik 2012-04-13 05:49:28

+0

根据使用情况,它可能也适合使用'AttributeModifier '并决定在'IModel'中使用哪些类。 – 2012-04-13 08:41:25

+0

你应该添加匹配到'valueToRemove'的开头和结尾的空格(和字符串开始/结尾),只要考虑'class =“foo foo-bar”''更好的是如果你使用'currentValue.split(“ \\ s +“)'来获取所有单独的类,然后重新添加它们,而不需要删除它们。对于奖励点,您也可以对'valueToRemove'执行相同的操作,以便使用一个'CssClassRemover'去除多个类。 – biziclop 2012-04-13 10:24:02

0

检票1.5+有org.apache.wicket.AttributeModifier#删除()

+4

嗯,看着javadoc(“创建一个属性修饰符,删除具有指定名称的属性”),它似乎没有做我想要的...听起来像它会完全删除“class”属性,就像问题中的SimpleAttributeModifier示例一样。 – Jonik 2012-04-13 16:07:06

2

大厦Jonik's answer,下面加负前瞻忽略不同风格类中间的事件(并且不区分大小写)。

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