2011-02-06 8 views
5

私はWicket newbです。これはちょうどWicketのライフサイクルの私の無知かもしれないので、私を教えてください!私の理解では、Wicket WebPageオブジェクトは一度インスタンス化されてからシリアル化されます。これは私のために混乱の点につながった、以下を参照してください。Wicket:コンポーネントを追加する場所は?コンストラクタ?または、事前レンダリング?

現在、私はサブクラス化するテンプレートクラスを持っています。私は、サブクラスでは、テンプレートの動作をオーバーライドする方法を示すWicketのドキュメントに例を踏襲:

protected void onBeforeRender() { 
     add(new Label("title", getTitle())); 

     super.onBeforeRender(); 
} 

protected String getTitle() { 
     return "template"; 
} 

サブクラス:

protected String getTitle() { 
     return "Home"; 
} 

をこれは非常によく動作します。私にはっきりしないことは、このための "ベストプラクティス"です。ページのリクエストごとにonBeforeRender()が呼び出されたようですね。これは、すべてがonBeforeRender()にあれば、ページ上でかなり多くの処理が行われるようです。私は他のWicketの例に簡単に従って、コンストラクタにいくつかのコンポーネントを追加してオーバーライドしたくないかもしれませんが、コンポーネントロジックを2つの場所に分けました。

すべてのサブクラスに含める予定のコンポーネントを追加する場合は、コンストラクタまたはonBeforeRender()に追加する必要がありますか?

答えて

10

addの代わりにaddOrReplace()を使用することもできます。

コンストラクタでオーバーライドされたメソッドを呼び出す場合は、Modelなどの遅延コールバックでその処理を実行してください。あなたの例では、溶液は、はるかに簡単です:ラベルの内容を取得するためにPropertyModelを使用し

public abstract class BasePage extends WebPage { 
    public BasePage() { 
     add(new Label("title", new PropertyModel<String>(this, "title"))); 
    } 
    public abstract String getTitle(); 
} 

は、ラベルに値をプッシュするよりもはるかに優れています。

4

例外がほとんどないルールとしてコンストラクタにコンポーネントを追加する必要があります。おおまかに言えば、階層(構築)を設定する段階と、それをレンダリングするための別の段階があります。 2つを混ぜることは推奨されていません(しばしば禁止されています)。

Pagenullを返さない component.getPage()ように)コンポーネントがページに追加されたとき、あなたは、一度だけ建設後に呼び出されるコンポーネントを追加する新しい onInitializeコールバックを上書きできないコンポーネントについては
+1

ありがとうございました。しかし、私は2つを混在させることはできません、テンプレートの動作をオーバーライドするための推奨される方法は何ですか?コンストラクタでオーバーライドされたメソッドを呼び出すことは悪い習慣です。 – gmallett

+0

これは例外です:-) – Eelco

0

onBeforeRenderメソッドは、コンポーネントの可視オプションまたはモデルの管理を処理するのに便利です。

+2

このニーズに合わせてonConfigure()コールバックを使用することをお勧めします –

関連する問題