amango
amango

Reputation: 65

wicket: how to update a component after AjaxLazyLoadPanel?

I have a page that has a status text label and a panel doing some DB query. since the query can take some time I am loading it using

add(new AjaxLazyLoadPanel("resultPanel")
{
    @Override
public Component getLazyLoadComponent(String id) {
        return new SearchResultPanel(id);
    }
};

which works very well.

My question is how to update the status label which is outside of the resultPanel, to show the number of search results?

I was thinking along the lines of addComonent(target) but I don't have a target? am i off the track?

Upvotes: 1

Views: 2677

Answers (3)

Gabriel Ruiu
Gabriel Ruiu

Reputation: 2803

Happened to come across this post and I have something to add as well.

The AjaxLazyLoadPanel now has an overridable method called onComponentLoaded(Component, AjaxRequestTarget) which could also solve your problem.

Upvotes: 0

biziclop
biziclop

Reputation: 49714

You can always obtain the current request target using RequestCycle.get().getRequestTarget(), provided that there is an active request cycle, so in theory you could do that from your lazy-loaded component constructor, check if it is an Ajax target, and add the component if it is.

Another solution is to look at the source code of AjaxLazyLoadPanel and create your own component based on it. (It's really simple but as you can see if you look at the code, there's no way you can make it expose the request target. This isn't a very OO thing to do, but as all the important functionality is wrapped in the constructor, you have very little choice..

I would avoid having to tamper with Javascript, unless there's really no other way.

Upvotes: 0

msj121
msj121

Reputation: 2842

Well the SearchResultPanel might look like this:

public class SearchResultPanel extends Panel implements IHeaderContributor{
   public SearchResultPanel(String id){
      super(id);
      ....
   }
   public void renderHead(IHeaderResponse response){
      response.renderOnDomReadyJavascript("alert('hello');");
   }
}

Now when it is loaded it should throw out that javascript. Another way answered on stackoverflow previously (though I do not like it) is to use an AjaxSelfUpdatingTimerBehavior, which unless the javascript should be ran more then once I do not like, and still it is less elegant in my opinion.

Look here for their answer: Wicket: reload AjaxLazyLoadPanel automatically

Upvotes: 1

Related Questions