質問
HY、特定の条件の下でのみ、ウィケットテンプレートの特定の部分(たとえばDiv)を表示したい(たとえば、それを入力するデータがある場合のみ)。問題は:
データを取得した場合にパネルを追加する(div を埋める)だけの場合、データなしでページを呼び出すたびに例外がスローされます(参照される wicket-id がコンポーネント ツリーに追加されないため)。
私の頭に浮かんだ唯一の解決策は、データがない場合に空のパネルを追加することでした。Java コードに不要なコードが含まれ、レンダリングされた HTML に空の div が多数含まれているため、これは理想的な解決策ではありません。
それでは、条件下でのみウィケットテンプレートのいくつかの部分を含めるより良い解決策はあるのでしょうか?
解決
これは古い質問ですが、もう 1 つの解決策が考えられます。 ウィケット:エンクロージャ (そして これ )
アップデート:今、私はこの機能を自分で必要としていました( ジェットウィック)。WebMarkupContainer を loggedIn 状態用と loggedOut 状態用に 1 つずつ使用し、適切な可視性を設定しています。
if (loggedIn()) {
WebMarkupContainer loggedInContainer = new WebMarkupContainer("loggedIn");
//## do something with the user
User user = getUserSomeWhere();
loggedInContainer.add(new UserSearchLink("userSearchLink"));
add(loggedInContainer);
add(WebMarkupContainer("loggedOut").setVisible(false));
} else {
add(new WebMarkupContainer("loggedIn").setVisible(false));
WebMarkupContainer loggedOutContainer = WebMarkupContainer("loggedOut");
loggedOutContainer.add(new LoginLink() {...});
add(loggedOutContainer);
}
私にとってこれの利点は、//## でマークされた行で NullpointerExc が発生するのを防ぐことと、この場合 wicket の囲み機能がより醜く見えることです。
他のヒント
@miaubizが言ったように、可視性が他の状態(フィールドが入力されているなど)に対して条件付きである場合は、setVisible(false)を呼び出すか、isVisible()メソッドをオーバーライドできます。
はい、isVisible をオーバーライドしたいとします。これにより、isVisible=false HTML マークアップが最終的な HTML ページにレンダリングされなくなります。また、ドキュメントによると(で言及されています) 空のパネル)、を使用できます。 WebMarkupコンテナ ラッピングコンポーネントとして。
this.add(new SimpleResourceModelLabel(NO_DATA_LABEL){
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() { return myList.isEmpty(); }
});
final WebMarkupContainer table = new WebMarkupContainer(MY_DATA_TABLE){
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() { return !myList.isEmpty(); }
};
setVisible(false) を呼び出すことができます。非表示にしたいコンポーネント上で。