2012-04-13 20 views
14

E 'abbastanza semplice per dinamicamente aggiungere una classe CSS a un componente in codice Java utilizzando un AttributeAppender:Come rimuovere una classe CSS da un componente Wicket?

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

Oppure, se hai estratto il sopra in un metodo di utilità appropriato o di classe, semplicemente qualcosa di simile :

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

Ma come posso rimuovere una classe CSS?

Si può facilmente rimuovere tutti classi CSS deselezionando l'attributo di classe di tutto:

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

... ma questo non è accettabile se il componente ha altre classi CSS che non si fanno desiderio rimuovere.

Wicket 1.4 (ma non esitate a postare consigli specifici per le versioni successive).

+3

Non è utile, eh - la cura di elaborare, downvoter? IMHO è utile (per me stesso e per gli altri) documentare aspetti non immediatamente evidenti di Wicket qui su SO. – Jonik

risposta

17

Ecco un modo mi si avvicinò con:

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

Il codice che utilizza l'helper sopra sarebbe allora:

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

(Naturalmente si può anche solo creare sottoclassi AttributeModifier anonimi come necessario , ma mettendo la logica in una classe di utilità o un metodo separato lo ripulisce molto.)

Modifica: Un verso migliorato su newValue() che gestisce meglio i casi d'angolo (vedi commento di biziclop). NB: utilizza Guava. (Sei invitati a inviare più semplice (regex?) Versioni.)

@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

** Sentitevi liberi di pubblicare modi migliori/più semplici per farlo. ** In particolare se trascuro qualcosa del genere che viene fornito con Wicket integrato ... – Jonik

+0

A seconda del caso d'uso potrebbe anche essere adatto per usare un AttributeModifier 'e decide quali classi usare in un' IModel'. –

+0

Dovresti aggiungere spazi bianchi (e inizio/fine stringa) corrispondenti all'inizio e alla fine di 'valueToRemove', considera il caso in cui' class = "foo foo-bar" 'Ancora meglio se usi' currentValue.split (" \\ s + ")' per ottenere tutte le singole classi e quindi riaggiungerle senza quella che si desidera rimuovere. Per un punto bonus, puoi anche fare lo stesso con 'valueToRemove' per poter rimuovere diverse classi con un singolo' CssClassRemover'. – biziclop

0

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

+4

Hmm, guardando il javadoc ("Crea un modificatore di attributo che rimuove un attributo con il nome specificato"), non sembra fare ciò che voglio ... Sembra che rimuoverebbe l'attributo "class" interamente , proprio come nell'esempio SimpleAttributeModifier nella domanda. – Jonik

2

Sulla Jonik's answer, il seguente aggiunge lookahead negativo ignorare le occorrenze nel mezzo di una classe di stile diversa (ed è insensibile alla distinzione tra maiuscole e minuscole).

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

ingresso Provato: http://fiddle.re/ah0ca6

Problemi correlati