AJAX経由で更新する必要があるコンポーネントがあるWicketページがあります。WicketコンポーネントはAJAX経由でリフレッシュされません
private class MyAjaxBehavior extends AbstractDefaultAjaxBehavior {
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.renderOnLoadJavascript("wicketAjaxPost(\"" + getCallbackUrl() + "\")");
}
@Override
public void onConfigure(Component component) {
firstComponent.setOutputMarkupId(true);
secondComponent.setOutputMarkupId(true);
}
@Override
protected void respond(AjaxRequestTarget target) {
firstComponent.replaceWith(createFirstComponent());
target.addComponent(firstComponent);
secondComponent.replaceWith(createSecondComponent());
target.addComponent(secondComponent);
}
}
そして、私はこのようなコンポーネントの階層があります:私は、次のAjaxBehaviorを持って
Page
- fragment1
- fragment1-1
- firstComponent
- secondComponent
問題がfirstComponent
は、AJAXコールバックの後にリフレッシュされることはありませんが。 secondComponent
が正しく更新されます。私はfirstComponent
をframent1-1
に移動しようとしましたが、それはうまくいきました!私はfirstComponent
を包むためにいくつかの余分な断片を使用しようとしましたが、それは役に立たなかった。
私はWicketのAjaxRequestTarget.respondComponent()
をデバッグしようとしました。次のコードがあります:
// Initialize temporary variables
final Page page = component.findParent(Page.class);
if (page == null)
{
// dont throw an exception but just ignore this component, somehow
// it got
// removed from the page.
// throw new IllegalStateException(
// "Ajax request attempted on a component that is not associated
// with a Page");
LOG.debug("component: " + component + " with markupid: " + markupId +
" not rendered because it was already removed from page");
return;
}
page
はfirstComponent
とsecondComponent
何とか再レンダリングされる二番目の両方のために、ここではnullです。
firstComponent
はなぜ再レンダリングされないのですか?どこを掘るべきですか?私はWicket 1.4.22を使用します。
UPD
私はtarget
ではなく、古いものに新しいコンポーネントを追加しようとしました。ページに新しいコンポーネントが作成されますが、古いコンポーネントは更新されません。だから私は1つのページの代わりに2つのコンポーネントを持っています。また、何らかの理由でHTMLマークアップ構造が壊れてしまいます。このように:
<div>
<table class="summary" style="width: 100%">
<tr>
<div wicket:id="firstComponent" />
</tr>
</table>
</div>
...
<wicket:fragment wicket:id="firstComponentFragment">
<th>title</th>
<td><span wicket:id="someText"></span></td>
</wicket:fragment>
ですから、新しいコンポーネントがテーブルの外に追加され見ることができます。
<div>
<div id="generated">new component is added here</div>
<table>
...
<tr>old component</tr>
</table>
</div>
firstComponent
のための私の改札マークアップは次のようになります。あなたは<table>
タグ内<div>
を持つことができない、またはブラウザは、テーブルの外に更新マークアップを追加します:
@Override
protected void respond(AjaxRequestTarget target) {
Component old = firstComponent;
firstComponent = createFirstComponent();
old.replaceWith(firstComponent);
target.addComponent(firstComponent);
}
更新:
AjaxEventBehavior( "domready")を使用すると、domが準備完了したときに自動的にイベントが発生します。 – svenmeier
最後に私はJavascriptでこれを解決しました。 :( – coolguy