| Apache Wicket > Framework Documentation > Reference library > How to do things in Wicket > AJAX > Working With AjaxRequestTarget |
| target.addComponent(myComponent) Be careful that when target.addComponent(myComponent) that myComponent.setOutputMarkupId(true) has been set. The ID is required in order for an update can be made on the client. |
You may be tempted to add a view (ListView, RefreshingView, DataView, etc.) to an AjaxRequestTarget only to to find out that you receive an exception indicating that the view cannot be added to the target. Here are a few tips when adding an updated views to targets:
Below is an example of a view using a WebMarkupContainer to target a RefreshingView. When a WebPage using the panel calls the addRatingScaleComponents(final AjaxRequestTarget target) method the ratingScaleContainer will be added to the target (not the panel):
public abstract class AbstractRatingScalePanel extends Panel { private final WebMarkupContainer ratingScaleContainer; private final RefreshingView ratingScalesView; /** * Creates a rating scale creation/display panel * * @param id * the ID of the panel * @param headerLabelModel * the model that will be used for the header */ public AbstractRatingScalePanel(final String id, final IModel headerLabelModel) { super(id); add(new Label("legend-scale-header", headerLabelModel)); ratingScaleContainer = new WebMarkupContainer("div-rating-scale-container"); // add the initial list of rating scales ratingScalesView = new RefreshingView("tr-rating-scale") { private static final long serialVersionUID = 1L; /** * {@inheritDoc} */ @Override protected final void populateItem(final Item item) {// WicketAjaxIndicatorAppender IndicatingAjaxLink // add the rating scale components item.add(new TextField("boundary")); item.add(new Label("rating")); } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override protected Iterator<RatingScale> getItemModels() { // load the rating scales return new ModelIteratorAdapter(loadRatingScales().iterator()) { /** * {@inheritDoc} */ @Override protected final IModel model(final Object object) { return new CompoundPropertyModel((RatingScale) object); } }; } }; // surround the view with a markup container ratingScaleContainer.add(ratingScalesView); add(ratingScaleContainer.setOutputMarkupId(true)); } /** * Adds the rating scale component(s) to the specified target * * @param target * the target to add the component(s) to */ public final void addRatingScaleComponents(final AjaxRequestTarget target) { target.addComponent(ratingScaleContainer); } /** * Loads/returns the rating scales used by the panel * * @return the rating scales used by the panel */ protected abstract List<RatingScale> loadRatingScales(); }
<?xml version="1.0" encoding="UTF-8"?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wicket="http://wicket.apache.org" xsi:schemaLocation="http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd http://wicket.apache.org" xml:lang="en"> <body> <wicket:panel> <fieldset> <legend wicket:id="legend-scale-header"> [4. Determine On What Scale You Will Be Scored] </legend> <div wicket:id="div-rating-scale-container"> <table border="0"> <tr wicket:id="tr-rating-scale"> <td style="text-align:center;"> <input wicket:id="boundary" type="text" size="10" /> </td> <td> = </td> <td> <span wicket:id="rating"> [Rating Value] </span> </td> </tr> </table> </div> </fieldset> </wicket:panel> </body> </html>