Ich habe eine Wicket-Seite mit einigen Komponenten, die über AJAX aktualisiert werden sollten. Ich habe folgendes AjaxBehavior:Wicket-Komponente wird nicht über AJAX aktualisieren
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);
}
}
Und ich habe eine Komponentenhierarchie wie folgt aus:
Page
- fragment1
- fragment1-1
- firstComponent
- secondComponent
Das Problem wird firstComponent
nie nach AJAX Callback aktualisiert. secondComponent
wird korrekt aktualisiert. Ich habe versucht, firstComponent
auf zu verschieben (nur experimentieren) und es hat funktioniert! Ich habe versucht, einige zusätzliche Fragmente zu verwenden, um firstComponent
zu wickeln, aber es half nicht.
Ich habe versucht, wicket AjaxRequestTarget.respondComponent()
zu debuggen. Es gibt den folgenden Code ein:
// 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
ist hier null sowohl für firstComponent
und secondComponent
aber die zweite wird irgendwie neu gerendert.
Irgendwelche Ideen warum firstComponent
wird nicht neu gerendert? Wo soll ich graben? Ich benutze Wicket 1.4.22.
UPD
Ich habe versucht, die neue Komponente target
und nicht die alte hinzuzufügen. Es erstellt die neue Komponente auf der Seite, aktualisiert jedoch nicht die alte Komponente. Also habe ich zwei Komponenten auf der Seite statt einer. Es bricht auch HTML-Markup-Struktur aus irgendeinem Grund. Wie folgt aus:
<div>
<div id="generated">new component is added here</div>
<table>
...
<tr>old component</tr>
</table>
</div>
Mein Wicket Markup für firstComponent
sieht wie folgt aus:
<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>
So können Sie die neue Komponente sehen außerhalb der Tabelle hinzugefügt.
@Override
protected void respond(AjaxRequestTarget target) {
Component old = firstComponent;
firstComponent = createFirstComponent();
old.replaceWith(firstComponent);
target.addComponent(firstComponent);
}
Update::
Sie sollten AjaxEventBehavior ("domready") verwenden, damit Ihr Ereignis automatisch ausgelöst wird, wenn das Dom bereit ist. – svenmeier
So habe ich das endlich über Javascript gelöst. :( – coolguy