2012-04-13 13 views
14

यह बहुत सीधा है गतिशील एक AttributeAppender का उपयोग कर जावा कोड में एक घटक के लिए एक CSS वर्ग को जोड़ने के लिए:एक विकेट घटक से सीएसएस कक्षा को कैसे हटाएं?

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

या, यदि आप एक उचित उपयोगिता विधि या वर्ग के लिए, बस की तरह कुछ में इसके बाद के संस्करण निकाला है :

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

लेकिन मैं एक सीएसएस कक्षा को कैसे हटा सकता हूं?

आप आसानी से वर्ग पूरी तरह विशेषता को साफ़ करके सभी सीएसएस वर्गों को दूर कर सकते हैं:

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

... लेकिन यह है कि स्वीकार्य है, तो घटक अन्य सीएसएस वर्गों है कि आप इच्छा नहीं है नहीं है हटाना।

विकेट 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 उपवर्गों बना सकते हैं के रूप में की जरूरत

+3

उपयोगी, हाँ नहीं - देखभाल विस्तृत करने, downvoter? आईएमएचओ एसओ पर यहां विकेट के गैर-तत्काल-स्पष्ट पहलुओं को दस्तावेज करने के लिए उपयोगी है (स्वयं और दूसरों के लिए)। – Jonik

उत्तर

17

यहाँ एक तरह से मैं के साथ आया है , लेकिन एक अलग उपयोगिता वर्ग या विधि में तर्क डालने से इसे बहुत साफ कर दिया जाता है।)

संपादित करें: एक बेहतर बनाम newValue() पर जो कोने के मामलों को बेहतर तरीके से संभालता है (biziclop द्वारा टिप्पणी देखें)। एनबी: Guava का उपयोग करता है। (आप संस्करणों सरल (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); 
} 
+0

** ऐसा करने के लिए बेहतर/सरल तरीके पोस्ट करने के लिए स्वतंत्र महसूस करें। ** विशेष रूप से अगर मैंने ऐसा कुछ अनदेखा किया जो विकेट के साथ आता है ... – Jonik

+0

उपयोग के मामले के आधार पर यह 'विशेषता मॉडिफायर' का उपयोग करने के लिए भी उपयुक्त हो सकता है 'और तय करें कि कौन से वर्ग' IModel' में उपयोग करें। –

+0

आपको शुरुआत में और 'valueToRemove' के अंत से मेल खाने वाले व्हाइटस्पेस (और स्ट्रिंग स्टार्ट/एंड) को जोड़ना चाहिए, बस उस स्थिति पर विचार करें जहां 'class =" foo foo-bar "' यदि आप' currentValue.split (" \\ s + ") 'सभी अलग-अलग वर्गों को प्राप्त करने के लिए और फिर उनको दोबारा जोड़ दें जिन्हें आप निकालना चाहते हैं। बोनस प्वाइंट के लिए, आप एक ही 'CssClassRemover' के साथ कई कक्षाओं को हटाने में सक्षम होने के लिए' valueToRemove' 'पर भी ऐसा कर सकते हैं। – biziclop

0

विकेट 1.5+ org.apache.wicket.AttributeModifier # निकालें()

+4

हम्म, javadoc को देखकर ("एक विशेषता संशोधक बनाता है जो निर्दिष्ट नाम के साथ एक विशेषता को हटा देता है"), ऐसा लगता है कि मैं जो चाहता हूं वह ऐसा नहीं लगता है ... लगता है जैसे यह "वर्ग" विशेषता पूरी तरह से हटा देगा , प्रश्न में SimpleAttributeModifier उदाहरण की तरह। – Jonik

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

संबंधित मुद्दे