私はカスタムWicketコンポーネントを使用してモデルオブジェクトをレンダリングしています。オブジェクトがnullの場合もあります。その場合、特定のdivが表示されます。コンポーネントのHTMLレンダリングコードでは、 "null"の場合と "nullでない"の場合の2つのdivがあり、他の内部マークアップもあります。一方は表示され、もう一方はマスクされます。Wicket "nullable"コンポーネントビュー
<div wicket:id="toDisplayWhenObjectIsNull">
...
</div>
<div wicket:id="toDisplayWhenObjectIsNotNull">
<span wicket:id="label">...</span>
<table wicket:id="table">...</table>
...
</div>
私が直面する問題は、モデルオブジェクトがnullの場合でも、Wicketが完全に2つのdivを作成することです。サブコンポーネントの建物(ラベル、テーブルなど)へのすべての呼び出しでは、私が面倒でエラーが発生しやすいnullであるかどうか、をチェックする必要があります。
これに対する最初の解決策を分割するだろう特定のwicketサブコンポーネントの非ヌル部分を、自身のクラスまたはマスターコンポーネントの内部クラスのいずれかとして返します。 「nullでない」divの代わりにこのコンポーネントを挿入します。しかし、それは必要なファイル(リソース、HTML、Javaコード)の数を2倍にします。これは理想的ではありません。
2番目の解決策は、他のコンポーネントをカプセル化するための「デコレータ」コンポーネントを作成し、そのモデルオブジェクトのヌルネスをチェックすることです。コンポーネントがnullの場合は標準divが表示され、そうでない場合は装飾コンポーネントに依存します。私は境界線や複合パネルを使ってこれを実装しようとしましたが、動作させることはできません。
// Client code, Java
ViewXPanel xpanel = new ViewXPanel("xpanel", new Model<X>(x));
add(xpanel);
// HTML
<div wicket:id="xpanel"/>
OR、必要に応じて、クライアントコードでこのようなものを使用して、表示されたコンポーネントの「NULL可能」のクライアントを担当します:
// Client code, Java
ViewXPanel xpanel = new NullableDecorator(?, ViewXPanel(...));
add(xpanel);
私は何を達成したいことは、このような何かであります
フラグメントを使用してみましたか?これらはこの問題に適用されるかもしれません。 – biziclop
いいえ、それを効果的に見ると、これが解決策の一部になる可能性があります。私は彼らに試してみましょう。 –
これはBorderで実現できないのだろうか?これは確かに一般的なケースですが、決して一般的なソリューションは必要ありませんでした。 2つの 'div'要素を作成するのは簡単です。もっと複雑で、ラップコンポーネントを作成します。とにかく、 'ShowOneBorder(Component1、Component2、IModel >)'を作成して適切に追加し、 'onConfigure()'を使って見えるように修正することができます。 – jbrookover