0

繰り返しliコンポーネント内にフラグメントを追加しようとしています:

<ul>
<li wicket:id="listView">HERE GOES MY FRAGMENT</li>
</ul>

リストビューに入力するコードは次のとおりです。

@Override
protected void populateItem(final org.apache.wicket.markup.repeater.Item<Message> item) {
                    Message msg = item.getModelObject();
                    log.info("Adding message fragment to markup: " + item.getMarkupId());
                    item.add(new MessageFragement(item.getMarkupId(), "messageFragment", this, msg));
}

生成された予期されるコードは次のとおりです。

<ul>
<li .... wicket:id="listView></li>
<li .... wicket:id="listView></li>
....
</ul>

しかし、フラグメントが追加されず、Runtime wicket 例外が発生します。

以下のコンポーネントはレンダリングに失敗しました。よくある問題は、コードにコンポーネントを追加したのに、マークアップでそれを参照するのを忘れていることです (したがって、コンポーネントは決してレンダリングされません)。

アイテム マークアップ ID をフラグメントのコンポーネント ID として使用できないのはなぜですか? これは、li に追加のタグを追加することで簡単に解決できるようになりました。

<ul><li wicket:id="listView"><div wicket:id="message"></div></li></ul>

そして、マークアップ ID「メッセージ」をフラグメントに追加します。しかし、私はそれをしたくありません。既に存在する <li> を使用してフラグメントをホストしたいだけですが、それは可能ですか?

みんなありがとう

4

2 に答える 2

1

解決策、またはより良い回避策を見つけたと思います。

<li> に Fragment のコンテナ タグを残します。

<ul>
<li wicket:id="listView"><div wicket:id="message">FRAGMENT</div></li>
</ul>

その後、MessageFragment で、setRenderBodyOnly(true)関数を使用してコンテナー タグをレンダリングしないように Fragment コンストラクターで設定しました。

public MessageFragement(String id, String markupId, MarkupContainer markupProvider, final Message message) {
            super(id, markupId, markupProvider, new Model<Message>(message));

            setRenderBodyOnly(true);
...
}

そして結果は期待通りです:

<ul>
    <li wicket:id="listView" wicketpath="...listView_1">MessageFragment1</li>
    <li wicket:id="listView" wicketpath="...listView_2">MessageFragment2</li>
    <li wicket:id="listView" wicketpath="...listView_3">MessageFragment3</li>
</ul>
于 2012-05-11T11:23:51.290 に答える
0

li リスト エントリをフラグメントのプレースホルダーとして使用する場合は、プレースホルダーでレンダリングする必要があるフラグメントに少なくとも wicket:fragment を提供する必要があります。

ただし、StripWicketTags を false に設定すると、マークアップで元の wicket:id が生成されますが、少なくともランダムなサフィックスが取得されるため、この ID は getMarkupId() の戻り値と等しくなりません。また、その ID には既にコンポーネントがアタッチされているため、他のコンポーネントをアタッチすることはできません。

于 2012-05-10T10:07:31.393 に答える