15

AttributeAppenderを使用してJavaコードのコンポーネントにCSSクラスを動的に追加するのは非常に簡単です。

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

または、上記を適切なユーティリティメソッドまたはクラスに抽出した場合は、次のようになります。

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

しかし、どうすればCSSクラスを削除できますか?

class属性を完全にクリアすることで、すべてのCSSクラスを簡単に削除できます。

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

...ただし、コンポーネントに削除したくない他のCSSクラスがある場合、これは受け入れられません。

Wicket 1.4(ただし、それ以降のバージョンに固有のアドバイスも投稿してください)。

4

3 に答える 3

17

これが私が思いついた1つの方法です:

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によるコメントを参照)。注意: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); 
}
于 2012-04-13T05:45:14.157 に答える
3

Jonikの回答に基づいて、以下は、異なるスタイルクラスの途中での発生を無視するために、否定的な先読みを追加します(大文字と小文字は区別されません)。

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

于 2015-05-08T13:28:41.653 に答える
0

Wicket 1.5以降にはorg.apache.wicket.AttributeModifier#remove()があります

于 2012-04-13T14:24:57.433 に答える