Wicket - ボディタグ属性を追加する

私は立ち往生している -

Wicket Panelにクラス属性を追加する必要があります。<body> tag of whatever page it's on. Example usage:

Java:

add(new SpecialSidebarComponent("sidebar"));

生成されるHTML:

<body class="sidebar">
   ...
   <div id="sidebar">My Wicket Panel</div>
   ...
</body>

Wicket:IDを追加してWicketコンポーネントにすることはできません。これは、私が持っている大きなページ階層のコンポーネントにページを追加するのが非常に難しくなります。ボディ属性。

私はBodyTagAttributeModifierがこのためであるかもしれないと思ったが、明らかにそれは何かのためであり、それを機能させることができない( Wicket:BodyTagAttributeModifierクラスの使い方?

役に立つアイデアは?

更新:

それを見ると、BodyTagAttributeModifierクラスは、Panelの親タグではのみ、ページの親タグでは<body> tag:

例(Scalaの構文):

class Home extends WebPage {
  add(new Sidebar("sidebar"))
}
class Sidebar(id: String) extends Panel(id) {
  add(new BodyTagAttributeModifier("class", true, new Model("layout-class"), getParent))
}

テンプレート:

<html>
<body>
    <div wicket:id="sidebar">Sidebar</div>
</body>
</html>

レンダリング:

<html>
<body>
    <div class="layout-class">
        

Hello World!

    </div>
</body>
</html>

非常に混乱する名前IMHO。問題は解決しませんが、少なくとも意味があります。

1

3 答え

私は個人的には、Javascriptオプションがこの特定のケースで最もクリーンであると考えています。しかし、 add(Component ...)に関する最終的なコメントは、あなたが setTransparentResolver(true)メソッドに興味があると思うようになります。これはどのように動作するのですか...

BasePage.html

<body wicket:id="body">
    <div wicket:id="panel" />
</body>

BasePage.java

public class BasePage extends Page {

    public String bodyClass = "";

    public BasePage() {
       super();
       WebMarkupContainer bodyContainer = new WebMarkupContainer("body");
       bodyContainer.setTransparentResolver(true);
       bodyContainer.add(new SimpleAttributeModifier("class", new PropertyModel(this, "bodyClass")));
    }
}

MyPage.java(BasePageを拡張)

public class MyPage extends BasePage {

    public MyPage() {
        super();
        add(new SidebarPanel("panel"));
        super.bodyClass = "sidebar";
    }
}

SidebarPanelをBasePageのbodyContainerに直接追加していないにもかかわらず、 setTransparentResolver(true)のためにSidebarPanelが機能します。

あなたの単純なケースでは、Javascriptを使ってください。サブクラスがコンテナ内に収まりきらないという一般的な問題については、透明な解決に注意してください。

3
追加された
もちろん、これはあなたが を使用していないことを前提としています。
追加された 著者 jbrookover,
すべてのページが BasePage を拡張していると仮定して、((BasePage)getPage())。bodyClass = ... を実行できます。私は確かにベースページのカスタムメソッドで多くのことをしてきました。
追加された 著者 jbrookover,
bodyContainer.add(...)のすべてにプレフィックスを付ける必要があるため、 body transparentResolver を使用すると、そのようにする必要はありません。また、 BasePage タイプのシナリオを使用していることがポスターから示されました。私はラッパーコンテナ( Border )を持つ Dialog 型のコンポーネントでこれを多く行いましたが、コンポーネントをいくつかのコンテナに追加する必要はありません親クラス。
追加された 著者 jbrookover,
まれに役立ちますが、それを適切に活用することができれば本当にクールです。私はそれが大好きなのは、異なるコンポーネントで同じフレームの数十の複雑なダイアログを作成するときです。 FrameDialog には、トランスペアレントリゾルバであったルートコンテナがあり、 AddTextDialog extends FrameDialog だけで "normal"のようなコンポーネントが追加されました。
追加された 著者 jbrookover,
いい例ですが、私はOPが Page<body>Panel code> Page サブクラスにあります。
追加された 著者 Xavi López,
まあ、確かに、それは私のコメントで指摘したように、行く方法です。しかし、私はまだ transparentResolver とサブクラス化がこの例では貢献しているのかどうか見ていません。
追加された 著者 Xavi López,
ああ、すごい、今私はそれを見て、あなたのコメントのおかげで:) +1、透明なリゾルバは良い選択です。この場合、 <body> タグと だけを保持するBasePageのスーパークラスを作成します。
追加された 著者 Xavi López,
クール:-) Wicketはとても強力です!
追加された 著者 Xavi López,

If you really can't give the <body> tag a wicket:id (I'll assume you don't have a BasePage that every, or almost every, other page extends in which to abstract this), it'll be not possible to know at page render time (when that <body> tag is rendered) what class to append to it, it will be simply copied as is from your HTML to the output.

しかし、あなたはjavascriptを使って同じことを達成することができます。 PanelIHeaderContributor を実装し、 IHeaderResponse.renderOnDomReadyJavscript()

public abstract class SpecialSidebarComponent(String id) extends Panel 
                 implements IHeaderContributor {
    .....
    public void renderHead(IHeaderResponse response){
        String JavaScript = "document.body.setAttribute('class', 'sidebar');";
        response.renderOnDomReadyJavascript(javascript);
    }
    ....
}
2
追加された
考えてくれてありがとう、Javascriptのアプローチを考慮していなかった - 面白そうだ。私は基本クラスを持っていますが、add(Component ...)は最終的です。addComponent(...)などの新しいカスタムメソッドを作成しない限り、サブクラスからコンポーネントを追加するのは苦労です。
追加された 著者 7zark7,
BasePageがある場合は、 <body >タグのwicket:idを使用し、 getPage()。find()インスタンス)を PanelonBeforeRender に追加し、 AttributeModifier を追加しますか?
追加された 著者 Xavi López,

私はあなたがBodyTagAttributeModifierを正しく実装していると思います。少なくとも、JavaDocによると。リンクされた記事のコンパイルの問題は、存在しないコンストラクタの使用に起因します...

SpecialSidebarComponentではこれを行うことができるはずです:

add(new BodyTagAttributeModifier("class", Model.of("sidebar"), this));

私は私の開発コンピュータではないので、今すぐ試すことはできません...

0
追加された
ありがとうございます - このクラスが実際に何を行うかに関する情報を追加し、Panelの親タグにのみ適用され、Page本体ではありません
追加された 著者 7zark7,
パネルbodyタグに書き込まれたものは、ページbodytagにコピーされます...
追加された 著者 Nicktar,