Wicket: AjaxRequestTarget vs onModelChanged

553 views Asked by At

I'm working on a code in a wicket project, where the original devs used the onModelChanged() method quite a lot in Ajax request handling methods. I, for one, however am not a strong believer of this implementation.

In fact, I can't think of any examples, where calling the target.add(...) is inferior to calling the onModelChanged method.

Am I missing some key concepts here?

Example:

public MyComponent extends Panel {

    public MyComponent(String id, Component... componentsToRefresh) {

        add(new AjaxLink<Void>("someId") {
            @Override
            public void onClick(AjaxRequestTarget target) {
                // some logic with model change

                for(Component c: componentsToRefresh) {
                    c.modelChanged();
                }

                target.add(componentsToRefresh);
            }
        };
    }
}

Now, there are a couple of things I don't agree with, the very first is the componentsToRefresh parameter, the second is (as the question suggests), the fact that we called c.modelChanged() on all components in that array. My guess would be that it is completely un necessary and instead of a parameter in the constructor, one should just write an empty function in MyComponent and override it, and put the necessary components in there when needed.

1

There are 1 answers

2
martin-g On

I would suggest to use Wicket Event system instead. That is, whenever the AjaxLink is clicked you will broadcast an event:

send(getPage(), Broadcast.BREATH, new MyEventPayload(target));

This will broadcast the event to the current Page and all its components.

Then in any of your components you can listen for events:

@Override
public void onEvent(IEvent event) {
  Object payload = event.getPayload();
  if (payload instanceof MyEventPayload) {
    ((MyEventPayload) payload).getTarget().add(this); // or any of my sub-components
    event.stop(); // optionally you can stop the broadcasting
  }
}

This way you do not couple unrelated components in your application.

See Wicket Guide for more information.