0

ページにアタッチされた Wicket パネルがあります。パネルが生成する、レンダリングされた HTML コードを取得する必要があります。ブラウザーに送信された出力をパネルが生成するのと同じ HTML が必要です。ページ全体の HTML はわかりません。

私のパネルは読み取り専用なので、出力が再生成されても問題ありません。

private MyPanel myPanel;

public void onIntialize() {
   super.onInitialize();
   add(myPanel = new MyPanel());
}

new AjaxLink() {
  public void onClick(AjaxRequestTarget target) {
    String myPanelHtml = // obtain html somehow from myPanel
    // do stuff with myPanelHtml
  }
}

パネルではないコンポーネントから HTML をレンダリングする必要がある場合、何か違いがありますか? マークアップを提供しないコンポーネント。

4

2 に答える 2

5

Wicket 6.7.0 からは、簡単に達成できます。

ComponentRenderer.render(Component c)

改札ページより:

ページまたはコンポーネントを文字列にレンダリングする

ユーザー リストに常に存在する問題の 1 つは、Wicket を使用して HTML 電子メール メッセージをレンダリングできるように、ページまたはコンポーネントを文字列にレンダリングする機能です。これで、ComponentRenderer を使用して、他のあまり明白でない方法に頼ることなく、実際にこれを行うことができます。

ComponentRenderer は、renderComponent と renderPage の 2 つのメソッドを公開し、その名前が示すとおりに機能します。ハッピーメール!

郵送用ですが、もちろんそれ以外の用途にもご利用いただけます。

于 2014-05-14T11:53:27.690 に答える
0

jordeu's answer と Wicket wiki に基づいて、これを作成しました。コンポーネント コンポーネントの階層を変更する必要はありませんが、私の場合、パネルは既にページの一部になっています。

ただし、アプリケーションの設定を変更したり、Wicket API の非公開部分を使用したりすることについて少し心配しています。

public static StringResponse getRenderedResponse(final Component container) {
    // store rendered markup to different place
    final Response originalResponse = RequestCycle.get().getResponse();
    StringResponse stringResponse = new StringResponse();
    RequestCycle.get().setResponse(stringResponse);

    // disable "component must be rendered only once per request" -check
    boolean originalComponentCheck = container.getApplication().getDebugSettings().getComponentUseCheck();
    container.getApplication().getDebugSettings().setComponentUseCheck(false);

    try {
        // prepareForRender() is not part of public Wicket API!!
        container.prepareForRender();
        container.render();
        container.afterRender();
    } finally {
        // restore RequestCycle and checks
        container.getApplication().getDebugSettings().setComponentUseCheck(originalComponentCheck);
        RequestCycle.get().setResponse(originalResponse);
    }
    return stringResponse;
}

使用法:

new AjaxLink() {
  public void onClick(AjaxRequestTarget target) {
    StringResponse response = getRenderedResponse(myPanel);
    String myPanelHtml = response.toString();
    // do stuff with myPanelHtml
}
于 2012-08-10T09:18:16.170 に答える