2012-04-13 17 views
14

Es bastante sencillo de forma dinámica añadir una clase CSS a un componente de código Java usando un AttributeAppender:¿Cómo eliminar una clase CSS de un componente de Wicket?

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

O, si ha extraído el anteriormente en un método de utilidad apropiada o clase, simplemente algo así como :

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

Pero, ¿cómo puedo eliminar una clase CSS?

usted puede quitar fácilmente todas clases CSS en la limpieza de la clase de atributos por completo:

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

... pero eso no es aceptable si el componente tiene otras clases CSS que no haces deseo para eliminar.

Wicket 1.4 (pero no dude en publicar consejos específicos para versiones posteriores también).

+3

No es útil, eh - el cuidado de elaborar, downvoter? En mi humilde opinión, es útil (para mí y para otros) documentar aspectos no inmediatamente obvios de Wicket aquí en SO. – Jonik

Respuesta

17

Ésta es una forma que se me ocurrió:

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

El código que utiliza el ayudante anterior sería entonces:

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

(Por supuesto, también se puede simplemente crear subclases AttributeModifier anónimos, según sea necesario , pero poner la lógica en una clase o método de utilidad separado lo limpia mucho).

Editar: Una versión mejorada on of newValue() que maneja mejor las cajas de esquina (vea el comentario de biziclop). NB: utiliza Guava. (Usted es bienvenido a publicar más simple (expresiones regulares?) Versiones.)

@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

** No dude en publicar formas mejores/más simples para hacer esto. ** Específicamente, si omito algo así que viene con Wicket incorporado ... – Jonik

+0

Dependiendo del caso de uso, también podría ser adecuado usar un 'AttributeModifier 'y decidir qué clases usar en un' IModel'. –

+0

Debe agregar el espacio en blanco (y el inicio/final de cadena) al principio y al final de 'valueToRemove', solo considere el caso donde' class = "foo foo-bar" 'Incluso mejor si usa' currentValue.split (" \\ s + ")' para obtener todas las clases individuales y luego volver a agregarlas sin la que desea eliminar. Para obtener un punto de bonificación, también puede hacer lo mismo con 'valueToRemove' para poder eliminar varias clases con un solo' CssClassRemover'. – biziclop

0

Wicket 1.5+ tiene org.apache.wicket.AttributeModifier # remove()

+4

Hmm, mirando el javadoc ("Crea un modificador de atributo que elimina un atributo con el nombre especificado"), no parece hacer lo que quiero ... Parece que eliminaría completamente el atributo "clase" , al igual que el ejemplo SimpleAttributeModifier en la pregunta. – Jonik

2

Basándose en Jonik's answer, añade la siguiente búsqueda negativa hacia delante ignorar las apariciones en el medio de una clase de estilo diferente (y no distingue entre mayúsculas y minúsculas).

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

entrada Probado: http://fiddle.re/ah0ca6

Cuestiones relacionadas