2016-03-19 13 views
0

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::

+2

Sie sollten AjaxEventBehavior ("domready") verwenden, damit Ihr Ereignis automatisch ausgelöst wird, wenn das Dom bereit ist. – svenmeier

+0

So habe ich das endlich über Javascript gelöst. :( – coolguy

Antwort

0

Sie werden die neu erstellte Komponente aktualisieren müssen Sie keine <div> in einem <table>-Tag oder der Browser außerhalb der Tabelle das Update Markup haben können, werden anhängen.

+0

Also der einzige Unterschied von meinem Code ist, dass die neue Komponente zu "Ziel" (nicht die alte) hinzugefügt wird. Ich habe versucht, es auf diese Weise, aber es fügt nur die neue Komponente auf der Seite und nicht die alte aktualisieren 1. Und es fügt die neue Komponente an der falschen Stelle in meinem HTML-Markup hinzu. Ich aktualisierte die Antwort, bitte werfen Sie einen Blick darauf. Btw, mit meiner 'secondComponent' füge ich die alte Komponente zu 'target' hinzu und es wird korrekt aktualisiert. – coolguy

+0

Ich glaube, du hast eine Antwort aktualisiert. Nun, ich benutze eigentlich nicht 'div' in' table', es ist nur die Art, Wicket-Fragment zu definieren. Es sollte in ' ... 'und es ist, wenn ich' createFirstComponent() 'zum ersten Mal verwende ich diese Komponente zu Seite (wenn die Seite geladen wird). Es scheint, als wäre es eine Art Wicket Bug. – coolguy

+0

Es scheint, Sie verwenden Wicket 1.4.x. Die offiziell unterstützten Versionen sind 6.x und 7.x. Der Fehler könnte in der Zwischenzeit behoben worden sein. Sie sollten upgraden! –

1

Manchmal ist es einfacher, eine Elternkomponente (z. B. das Formular selbst) zum Ajax-Antwortziel hinzuzufügen, damit Sie sicher sind, dass alles darunter aktualisiert wird. Also keine Duplikate oder fehlende Updates. Das Aktualisieren nur einer speziellen Komponente ist nur erforderlich, wenn Sie in diesem Fall die Leistung benötigen. Obwohl Sie einen Wrapper-Container definieren können, den Sie nur aktualisieren, um sicherzustellen, dass altes Markup entfernt wird.

Verwandte Themen