ページの一部を非表示または表示するリンクを作成しようとしています。リンクは再利用可能であり、状態に応じて2つの画像のいずれかを表示する必要があります。
リンクを使用するすべてのページに2つのサブコンポーネントを追加するのはちょっと不格好なので、コンテンツを自動的に追加しながらリンクのように動作するコンポーネントを作成したいと思いました。
これはリンクコンポーネントです:
public class ToggleVisibilityLink extends AjaxFallbackLink<Boolean>
{
public ToggleVisibilityLink(final String id, final IModel<Boolean> model)
{
super(id, model);
setOutputMarkupId(true);
add(new Image("collapseImage")
{
@Override
public boolean isVisible()
{
return !getModelObject();
}
});
add(new Image("expandImage")
{
@Override
public boolean isVisible()
{
return getModelObject();
}
});
}
@Override
public void onClick(final AjaxRequestTarget target)
{
setModelObject(!getModelObject());
if (target != null)
{
target.add(this);
send(this.getParent(), Broadcast.EXACT, target);
}
}
}
そしてこれは私が現在HTMLでそれを使用する方法です(これは私がリンクを使用するページまたはパネルに追加されます):
<a href="#" wicket:id="collapseExpandLink" class="collapseExpandLink">
<wicket:link>
<img src="collapse.png" wicket:id="collapseImage" class="collapseExpandImage collapse">
</wicket:link>
<wicket:link>
<img src="expand.png" wicket:id="expandImage" class="collapseExpandImage expand">
</wicket:link>
</a>
そして、対応するJava呼び出し:
add(new ToggleVisibilityLink("collapseExpandLink", new PropertyModel(this, "hidden")));
ただし、ToggleVisibilityLinkの内部について知っている必要があるため、リンク内の本文をスキップできるようにしたいと思います。Wicketの動的マークアップを開始点として使用して、IMarkupResourceStreamProviderを試してみました。グーグルで検索すると、ポスターがPanelを使用している場合にのみそれを機能させることができた別の例を見つけました。また、それも可能でした。ただし、マークアップでリンクのスタイルを設定できないため、リンクを保持し、パネル内にパッケージ化しないようにします。
また、リンクとその本体をカプセル化するための代替案も受け入れています。