You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wicket.apache.org by Yoav Stern <yo...@betamedia.co.il> on 2014/01/21 08:19:33 UTC

AjaxButton does not get register to the wicket events , after it rendered by ajax request

My scenario: on an ajax event I replace a webmarkupContainer with one of my
components which have some wicket IBehaviorListener.

The problem is that this replace happen due to Ajax request, and the
behavior gets listed on don ready:

Wicket.Event.add(window, "domready", function(event) {
Wicket.Ajax.get({'u': 'some/url', 'c': 'linkId', 'e':'click'}));
  // ... more event registrations and onDomReady scripts }

I'm assuming that, being generated in the this event registration code
happens for all components that are added explicitly, but not for any
components that are added dynamically by me.

How can I call the new container with the Ajax behaviors or change the
current implementation so the wicket Ajax behaviors would be called?


To be more precise I have a table with a filter which rendered by replacing
web markup container with this TableWithFilter. This scenario happens on
Ajax so when the page loaded by the first time the TableWithFilter does not
exist, it will appear on screen due to Ajax request that will occur

TableWithFilter contains AbstractFilterPanel which has a org.apache.wicket.
ajax.markup.html.form.AjaxButton which render the table by Ajax the button
is

initilze in the c'tor like this :

public abstract class AbstractFilterPanel extends Panel {
public AbstractFilterPanel(String id, IModel<?> model, BMDefaultDataGrid
toRender, SearchCriteria searchCriteriaIn, FeedbackPanel feed) {
 super(id, model);
 this.tableTorender = toRender;
 this.setSearchCriteria(searchCriteriaIn);
 this.feedbackPanel = feed;

}
//called by the AbstractFilterPanel sons
 protected void init() {
 Injector.get().inject(this);
 setOutputMarkupId(true);
 form = new ExpendedForm(FORM);
 form.setOutputMarkupId(true);
 form.setMarkupId("fillter-form");
 add(form);

 new AjaxButton(SUBMIT_FILLTER_FORM, form) {

private static final long serialVersionUID = 1L;


@Override

protected void onSubmit(AjaxRequestTarget target, Form<?> form) {

getSearchCriteria().clear();

onFillterSubmited();

if (getPreDefinedSearchCriteria() != null) {

getSearchCriteria().and(getPreDefinedSearchCriteria());

}

toRender.resetSelectedItems();

target.add(toRender);

toRender.resetCurrentPage();

target.add(feedbackPanel);

}

@Override

protected void onError(AjaxRequestTarget target, Form<?> form) {

target.add(feedbackPanel);

}

@Override

public boolean isEnabled() {

return super.isEnabled() && isApplyBtnEnabled();

}

}

}

what should AbstractFilterPanel implement in order to add a javascript that
register his appaly btn when it's rendered on page ?


Thanks in advance.

Re: AjaxButton does not get register to the wicket events , after it rendered by ajax request

Posted by Sven Meier <sv...@meiers.net>.
Try adding the form to the AjaxRequestTarget.

And please move this question to the user's list.

Sven

On 01/21/2014 08:38 AM, Yoav Stern wrote:
> i want to minimize the amount of code here this is the full class
> /**
>   * @author yoav stern
>   *
>   * @since Jun 24, 2013
>   */
> package com.betamedia.tp.backoffice.components.utils.absractfilter;
>
> import java.util.Iterator;
> import java.util.Map;
> import java.util.Map.Entry;
>
> import org.apache.wicket.ajax.AjaxRequestTarget;
> import org.apache.wicket.ajax.markup.html.form.AjaxButton;
> import org.apache.wicket.injection.Injector;
> import org.apache.wicket.markup.head.IHeaderResponse;
> import org.apache.wicket.markup.html.form.Form;
> import org.apache.wicket.markup.html.form.FormComponent;
> import org.apache.wicket.markup.html.form.validation.IFormValidator;
> import org.apache.wicket.markup.html.panel.FeedbackPanel;
> import org.apache.wicket.markup.html.panel.Panel;
> import org.apache.wicket.model.IModel;
> import org.apache.wicket.util.string.Strings;
>
> import com.betamedia.common.logging.Log;
> import com.betamedia.common.logging.LogFactory;
> import com.betamedia.common.search.criteria.SearchCriteria;
> import com.betamedia.common.utils.BeanUtils;
> import com.betamedia.tp.backoffice.components.grid.BMDefaultDataGrid;
> import com.betamedia.tp.backoffice.utils.GridViewType;
>
> public abstract class AbstractFilterPanel extends Panel {
>
> private static final long serialVersionUID = 1L;
>   private static final String SUBMIT_FILLTER_FORM = "submit_fillter_form";
>   private static final String FORM = "form";
> protected Map<String, String> filterCritriaMap;
>   @SuppressWarnings("unused")
> protected static final Log log = LogFactory.getLog();
>   protected BMDefaultDataGrid tableTorender;
>
> @SuppressWarnings("rawtypes")
>   private SearchCriteria searchCriteria;
>   @SuppressWarnings("rawtypes")
>   private SearchCriteria preDefinedSearchCriteria;
>
> protected final FeedbackPanel feedbackPanel;
>   protected Form<Void> form;
> protected AjaxButton applyBtn;
>
> public AbstractFilterPanel(String id, IModel<?> model, BMDefaultDataGrid
> toRender, SearchCriteria searchCriteriaIn, FeedbackPanel feed) {
>   super(id, model);
>   this.tableTorender = toRender;
>   this.setSearchCriteria(searchCriteriaIn);
>   this.feedbackPanel = feed;
>
> }
>
> public AbstractFilterPanel(String id, BMDefaultDataGrid toRender,
> SearchCriteria searchCriteriaIn, FeedbackPanel feed) {
>   super(id);
>   this.tableTorender = toRender;
>   this.setSearchCriteria(searchCriteriaIn);
>   this.feedbackPanel = feed;
>
> }
>
> public AbstractFilterPanel(String id, BMDefaultDataGrid toRender,
> SearchCriteria searchCriteriaIn, FeedbackPanel feed,
>   Map<String, String> fillterByList) {
> this(id, toRender, searchCriteriaIn, feed);
>   this.filterCritriaMap = fillterByList;
>   setFilterToModel();
>   }
>
> /**
>   * @param id
>   * @param model
>   * @param toRender
>   * @param searchCriteriaIn
>   * @param feed
>   * @param fillterByList
>   */
> public AbstractFilterPanel(String id, IModel<?> model, BMDefaultDataGrid
> toRender, SearchCriteria searchCriteriaIn, FeedbackPanel feed,
>   Map<String, String> fillterByList) {
> this(id, model, toRender, searchCriteriaIn, feed);
>   this.filterCritriaMap = fillterByList;
>   setFilterToModel();
>
> }
>
> /**
>   * @param fillterByList
>   */
> protected void setFilterToModel() {
>   Object defaultModelObject = getDefaultModelObject();
>   if (filterCritriaMap != null && !filterCritriaMap.isEmpty()) {
>   Iterator<Entry<String, String>> it = filterCritriaMap.entrySet().iterator(
> );
>   while (it.hasNext()) {
>   Map.Entry<String, String> pairs = it.next();
>   insertLastPagePropertyToFilterModel(defaultModelObject, pairs);
>   }
> }
> onFillterSubmited();
>   if (getPreDefinedSearchCriteria() != null) {
>   getSearchCriteria().and(getPreDefinedSearchCriteria());
>   }
> }
>
> /**
>   * this function decide how to insert property value to model , in most
>   * cases would not be @override , unless the property which is string is an
>   * instance in the model and therefore should be handled otherwise
>   *
>   * @param defaultModelObject
>   * @param pairs
>   */
> protected void insertLastPagePropertyToFilterModel(Object defaultModelObject,
> Map.Entry<String, String> pairs) {
>   BeanUtils.setProperty(defaultModelObject, pairs.getKey(), pairs.getValue(
> ));
>   }
>
> protected void init() {
>   Injector.get().inject(this);
>   setOutputMarkupId(true);
>   form = new ExpendedForm(FORM);
>   form.setOutputMarkupId(true);
>   form.setMarkupId("fillter-form");
>   add(form);
>   form.add(new IFormValidator() {
>
> private static final long serialVersionUID = 1L;
>
>   @Override
> public void validate(Form<?> form) {
>   String err = formValidation();
>   if (!Strings.isEmpty(err)) {
>   form.error(err);
>   }
> }
>
> @Override
> public FormComponent<?>[] getDependentFormComponents() {
>   return null;
> }
>   });
> form.add(doSubmit(tableTorender));
>   }
>
> /**
>   * @return
>   */
>   protected String getInputToClearIds() {
>
> return "";
> }
>
> /**
>   * @param toRender
>   * @return doSubmit button
>   */
>   private AjaxButton doSubmit(final BMDefaultDataGrid toRender) {
>   applyBtn = new AjaxButton(SUBMIT_FILLTER_FORM, form) {
>   private static final long serialVersionUID = 1L;
>
> @Override
>   protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
>   getSearchCriteria().clear();
>   onFillterSubmited();
>   if (getPreDefinedSearchCriteria() != null) {
>   getSearchCriteria().and(getPreDefinedSearchCriteria());
>   }
> toRender.resetSelectedItems();
>   target.add(toRender);
>   toRender.resetCurrentPage();
>   target.add(feedbackPanel);
>   }
>
> @Override
> protected void onError(AjaxRequestTarget target, Form<?> form) {
>   target.add(feedbackPanel);
>   }
>
> @Override
> public boolean isEnabled() {
>   return super.isEnabled() && isApplyBtnEnabled();
>
> }
>
> };
> applyBtn.setOutputMarkupId(true);
>   return applyBtn;
>   }
>
> /**
>   * this method will be called when filter is submitted
>   */
>
> public abstract void onFillterSubmited();
>
> /**
>   * this method will be called when on clear is submitted
>   */
>   public abstract void onClearSubmited();
>
> protected boolean isClearVisible() {
>   return true;
> }
>
>   protected String formValidation() {
>   return null;
> }
>
>   private class ExpendedForm extends Form {
>
> private static final long serialVersionUID = 1L;
>
> public ExpendedForm(String id) {
>   super(id);
>
> }
>
> @Override
> public void renderHead(IHeaderResponse response) {
>   super.renderHead(response);
>   }
>
> }
>
> protected boolean isApplyBtnEnabled() {
>   return true;
> }
>
>   public SearchCriteria getPreDefinedSearchCriteria() {
>   return preDefinedSearchCriteria;
>   }
>
> public void setPreDefinedSearchCriteria(SearchCriteria
> preDefinedSearchCriteria) {
>   this.preDefinedSearchCriteria = preDefinedSearchCriteria;
>   }
>
> /**
>   * turn when coming from entity inVisibility the id of the entity came from
>   *
>   * @param cameFromGridView
>   */
> public void turnFilterCameFromInvisable(GridViewType cameFromGridView) {
>   throw new UnsupportedOperationException("this filter does not suppo");
>   }
>
> public SearchCriteria getSearchCriteria() {
>   return searchCriteria;
>   }
>
> public void setSearchCriteria(SearchCriteria searchCriteria) {
>   this.searchCriteria = searchCriteria;
>   }
>
> }
>
>
> On Tue, Jan 21, 2014 at 9:25 AM, Sven Meier <sv...@meiers.net> wrote:
>
>> You have to add the AjaxButton to the component tree. I don't see this in
>> your code.
>>
>> If a parent container is updated via AjaxRequestTarget, all its children
>> will automatically be updated too.
>>
>> Regards
>> Sven
>>
>>
>> On 01/21/2014 08:19 AM, Yoav Stern wrote:
>>
>>> My scenario: on an ajax event I replace a webmarkupContainer with one of
>>> my
>>> components which have some wicket IBehaviorListener.
>>>
>>> The problem is that this replace happen due to Ajax request, and the
>>> behavior gets listed on don ready:
>>>
>>> Wicket.Event.add(window, "domready", function(event) {
>>> Wicket.Ajax.get({'u': 'some/url', 'c': 'linkId', 'e':'click'}));
>>>     // ... more event registrations and onDomReady scripts }
>>>
>>> I'm assuming that, being generated in the this event registration code
>>> happens for all components that are added explicitly, but not for any
>>> components that are added dynamically by me.
>>>
>>> How can I call the new container with the Ajax behaviors or change the
>>> current implementation so the wicket Ajax behaviors would be called?
>>>
>>>
>>> To be more precise I have a table with a filter which rendered by
>>> replacing
>>> web markup container with this TableWithFilter. This scenario happens on
>>> Ajax so when the page loaded by the first time the TableWithFilter does
>>> not
>>> exist, it will appear on screen due to Ajax request that will occur
>>>
>>> TableWithFilter contains AbstractFilterPanel which has a
>>> org.apache.wicket.
>>> ajax.markup.html.form.AjaxButton which render the table by Ajax the
>>> button
>>> is
>>>
>>> initilze in the c'tor like this :
>>>
>>> public abstract class AbstractFilterPanel extends Panel {
>>> public AbstractFilterPanel(String id, IModel<?> model, BMDefaultDataGrid
>>> toRender, SearchCriteria searchCriteriaIn, FeedbackPanel feed) {
>>>    super(id, model);
>>>    this.tableTorender = toRender;
>>>    this.setSearchCriteria(searchCriteriaIn);
>>>    this.feedbackPanel = feed;
>>>
>>> }
>>> //called by the AbstractFilterPanel sons
>>>    protected void init() {
>>>    Injector.get().inject(this);
>>>    setOutputMarkupId(true);
>>>    form = new ExpendedForm(FORM);
>>>    form.setOutputMarkupId(true);
>>>    form.setMarkupId("fillter-form");
>>>    add(form);
>>>
>>>    new AjaxButton(SUBMIT_FILLTER_FORM, form) {
>>>
>>> private static final long serialVersionUID = 1L;
>>>
>>>
>>> @Override
>>>
>>> protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
>>>
>>> getSearchCriteria().clear();
>>>
>>> onFillterSubmited();
>>>
>>> if (getPreDefinedSearchCriteria() != null) {
>>>
>>> getSearchCriteria().and(getPreDefinedSearchCriteria());
>>>
>>> }
>>>
>>> toRender.resetSelectedItems();
>>>
>>> target.add(toRender);
>>>
>>> toRender.resetCurrentPage();
>>>
>>> target.add(feedbackPanel);
>>>
>>> }
>>>
>>> @Override
>>>
>>> protected void onError(AjaxRequestTarget target, Form<?> form) {
>>>
>>> target.add(feedbackPanel);
>>>
>>> }
>>>
>>> @Override
>>>
>>> public boolean isEnabled() {
>>>
>>> return super.isEnabled() && isApplyBtnEnabled();
>>>
>>> }
>>>
>>> }
>>>
>>> }
>>>
>>> what should AbstractFilterPanel implement in order to add a javascript
>>> that
>>> register his appaly btn when it's rendered on page ?
>>>
>>>
>>> Thanks in advance.
>>>
>>>


Re: AjaxButton does not get register to the wicket events , after it rendered by ajax request

Posted by Yoav Stern <yo...@betamedia.co.il>.
i want to minimize the amount of code here this is the full class
/**
 * @author yoav stern
 *
 * @since Jun 24, 2013
 */
package com.betamedia.tp.backoffice.components.utils.absractfilter;

import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.injection.Injector;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.validation.IFormValidator;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.string.Strings;

import com.betamedia.common.logging.Log;
import com.betamedia.common.logging.LogFactory;
import com.betamedia.common.search.criteria.SearchCriteria;
import com.betamedia.common.utils.BeanUtils;
import com.betamedia.tp.backoffice.components.grid.BMDefaultDataGrid;
import com.betamedia.tp.backoffice.utils.GridViewType;

public abstract class AbstractFilterPanel extends Panel {

private static final long serialVersionUID = 1L;
 private static final String SUBMIT_FILLTER_FORM = "submit_fillter_form";
 private static final String FORM = "form";
protected Map<String, String> filterCritriaMap;
 @SuppressWarnings("unused")
protected static final Log log = LogFactory.getLog();
 protected BMDefaultDataGrid tableTorender;

@SuppressWarnings("rawtypes")
 private SearchCriteria searchCriteria;
 @SuppressWarnings("rawtypes")
 private SearchCriteria preDefinedSearchCriteria;

protected final FeedbackPanel feedbackPanel;
 protected Form<Void> form;
protected AjaxButton applyBtn;

public AbstractFilterPanel(String id, IModel<?> model, BMDefaultDataGrid
toRender, SearchCriteria searchCriteriaIn, FeedbackPanel feed) {
 super(id, model);
 this.tableTorender = toRender;
 this.setSearchCriteria(searchCriteriaIn);
 this.feedbackPanel = feed;

}

public AbstractFilterPanel(String id, BMDefaultDataGrid toRender,
SearchCriteria searchCriteriaIn, FeedbackPanel feed) {
 super(id);
 this.tableTorender = toRender;
 this.setSearchCriteria(searchCriteriaIn);
 this.feedbackPanel = feed;

}

public AbstractFilterPanel(String id, BMDefaultDataGrid toRender,
SearchCriteria searchCriteriaIn, FeedbackPanel feed,
 Map<String, String> fillterByList) {
this(id, toRender, searchCriteriaIn, feed);
 this.filterCritriaMap = fillterByList;
 setFilterToModel();
 }

/**
 * @param id
 * @param model
 * @param toRender
 * @param searchCriteriaIn
 * @param feed
 * @param fillterByList
 */
public AbstractFilterPanel(String id, IModel<?> model, BMDefaultDataGrid
toRender, SearchCriteria searchCriteriaIn, FeedbackPanel feed,
 Map<String, String> fillterByList) {
this(id, model, toRender, searchCriteriaIn, feed);
 this.filterCritriaMap = fillterByList;
 setFilterToModel();

}

/**
 * @param fillterByList
 */
protected void setFilterToModel() {
 Object defaultModelObject = getDefaultModelObject();
 if (filterCritriaMap != null && !filterCritriaMap.isEmpty()) {
 Iterator<Entry<String, String>> it = filterCritriaMap.entrySet().iterator(
);
 while (it.hasNext()) {
 Map.Entry<String, String> pairs = it.next();
 insertLastPagePropertyToFilterModel(defaultModelObject, pairs);
 }
}
onFillterSubmited();
 if (getPreDefinedSearchCriteria() != null) {
 getSearchCriteria().and(getPreDefinedSearchCriteria());
 }
}

/**
 * this function decide how to insert property value to model , in most
 * cases would not be @override , unless the property which is string is an
 * instance in the model and therefore should be handled otherwise
 *
 * @param defaultModelObject
 * @param pairs
 */
protected void insertLastPagePropertyToFilterModel(Object defaultModelObject,
Map.Entry<String, String> pairs) {
 BeanUtils.setProperty(defaultModelObject, pairs.getKey(), pairs.getValue(
));
 }

protected void init() {
 Injector.get().inject(this);
 setOutputMarkupId(true);
 form = new ExpendedForm(FORM);
 form.setOutputMarkupId(true);
 form.setMarkupId("fillter-form");
 add(form);
 form.add(new IFormValidator() {

private static final long serialVersionUID = 1L;

 @Override
public void validate(Form<?> form) {
 String err = formValidation();
 if (!Strings.isEmpty(err)) {
 form.error(err);
 }
}

@Override
public FormComponent<?>[] getDependentFormComponents() {
 return null;
}
 });
form.add(doSubmit(tableTorender));
 }

/**
 * @return
 */
 protected String getInputToClearIds() {

return "";
}

/**
 * @param toRender
 * @return doSubmit button
 */
 private AjaxButton doSubmit(final BMDefaultDataGrid toRender) {
 applyBtn = new AjaxButton(SUBMIT_FILLTER_FORM, form) {
 private static final long serialVersionUID = 1L;

@Override
 protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
 getSearchCriteria().clear();
 onFillterSubmited();
 if (getPreDefinedSearchCriteria() != null) {
 getSearchCriteria().and(getPreDefinedSearchCriteria());
 }
toRender.resetSelectedItems();
 target.add(toRender);
 toRender.resetCurrentPage();
 target.add(feedbackPanel);
 }

@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
 target.add(feedbackPanel);
 }

@Override
public boolean isEnabled() {
 return super.isEnabled() && isApplyBtnEnabled();

}

};
applyBtn.setOutputMarkupId(true);
 return applyBtn;
 }

/**
 * this method will be called when filter is submitted
 */

public abstract void onFillterSubmited();

/**
 * this method will be called when on clear is submitted
 */
 public abstract void onClearSubmited();

protected boolean isClearVisible() {
 return true;
}

 protected String formValidation() {
 return null;
}

 private class ExpendedForm extends Form {

private static final long serialVersionUID = 1L;

public ExpendedForm(String id) {
 super(id);

}

@Override
public void renderHead(IHeaderResponse response) {
 super.renderHead(response);
 }

}

protected boolean isApplyBtnEnabled() {
 return true;
}

 public SearchCriteria getPreDefinedSearchCriteria() {
 return preDefinedSearchCriteria;
 }

public void setPreDefinedSearchCriteria(SearchCriteria
preDefinedSearchCriteria) {
 this.preDefinedSearchCriteria = preDefinedSearchCriteria;
 }

/**
 * turn when coming from entity inVisibility the id of the entity came from
 *
 * @param cameFromGridView
 */
public void turnFilterCameFromInvisable(GridViewType cameFromGridView) {
 throw new UnsupportedOperationException("this filter does not suppo");
 }

public SearchCriteria getSearchCriteria() {
 return searchCriteria;
 }

public void setSearchCriteria(SearchCriteria searchCriteria) {
 this.searchCriteria = searchCriteria;
 }

}


On Tue, Jan 21, 2014 at 9:25 AM, Sven Meier <sv...@meiers.net> wrote:

> You have to add the AjaxButton to the component tree. I don't see this in
> your code.
>
> If a parent container is updated via AjaxRequestTarget, all its children
> will automatically be updated too.
>
> Regards
> Sven
>
>
> On 01/21/2014 08:19 AM, Yoav Stern wrote:
>
>> My scenario: on an ajax event I replace a webmarkupContainer with one of
>> my
>> components which have some wicket IBehaviorListener.
>>
>> The problem is that this replace happen due to Ajax request, and the
>> behavior gets listed on don ready:
>>
>> Wicket.Event.add(window, "domready", function(event) {
>> Wicket.Ajax.get({'u': 'some/url', 'c': 'linkId', 'e':'click'}));
>>    // ... more event registrations and onDomReady scripts }
>>
>> I'm assuming that, being generated in the this event registration code
>> happens for all components that are added explicitly, but not for any
>> components that are added dynamically by me.
>>
>> How can I call the new container with the Ajax behaviors or change the
>> current implementation so the wicket Ajax behaviors would be called?
>>
>>
>> To be more precise I have a table with a filter which rendered by
>> replacing
>> web markup container with this TableWithFilter. This scenario happens on
>> Ajax so when the page loaded by the first time the TableWithFilter does
>> not
>> exist, it will appear on screen due to Ajax request that will occur
>>
>> TableWithFilter contains AbstractFilterPanel which has a
>> org.apache.wicket.
>> ajax.markup.html.form.AjaxButton which render the table by Ajax the
>> button
>> is
>>
>> initilze in the c'tor like this :
>>
>> public abstract class AbstractFilterPanel extends Panel {
>> public AbstractFilterPanel(String id, IModel<?> model, BMDefaultDataGrid
>> toRender, SearchCriteria searchCriteriaIn, FeedbackPanel feed) {
>>   super(id, model);
>>   this.tableTorender = toRender;
>>   this.setSearchCriteria(searchCriteriaIn);
>>   this.feedbackPanel = feed;
>>
>> }
>> //called by the AbstractFilterPanel sons
>>   protected void init() {
>>   Injector.get().inject(this);
>>   setOutputMarkupId(true);
>>   form = new ExpendedForm(FORM);
>>   form.setOutputMarkupId(true);
>>   form.setMarkupId("fillter-form");
>>   add(form);
>>
>>   new AjaxButton(SUBMIT_FILLTER_FORM, form) {
>>
>> private static final long serialVersionUID = 1L;
>>
>>
>> @Override
>>
>> protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
>>
>> getSearchCriteria().clear();
>>
>> onFillterSubmited();
>>
>> if (getPreDefinedSearchCriteria() != null) {
>>
>> getSearchCriteria().and(getPreDefinedSearchCriteria());
>>
>> }
>>
>> toRender.resetSelectedItems();
>>
>> target.add(toRender);
>>
>> toRender.resetCurrentPage();
>>
>> target.add(feedbackPanel);
>>
>> }
>>
>> @Override
>>
>> protected void onError(AjaxRequestTarget target, Form<?> form) {
>>
>> target.add(feedbackPanel);
>>
>> }
>>
>> @Override
>>
>> public boolean isEnabled() {
>>
>> return super.isEnabled() && isApplyBtnEnabled();
>>
>> }
>>
>> }
>>
>> }
>>
>> what should AbstractFilterPanel implement in order to add a javascript
>> that
>> register his appaly btn when it's rendered on page ?
>>
>>
>> Thanks in advance.
>>
>>
>

Re: AjaxButton does not get register to the wicket events , after it rendered by ajax request

Posted by Sven Meier <sv...@meiers.net>.
You have to add the AjaxButton to the component tree. I don't see this 
in your code.

If a parent container is updated via AjaxRequestTarget, all its children 
will automatically be updated too.

Regards
Sven

On 01/21/2014 08:19 AM, Yoav Stern wrote:
> My scenario: on an ajax event I replace a webmarkupContainer with one of my
> components which have some wicket IBehaviorListener.
>
> The problem is that this replace happen due to Ajax request, and the
> behavior gets listed on don ready:
>
> Wicket.Event.add(window, "domready", function(event) {
> Wicket.Ajax.get({'u': 'some/url', 'c': 'linkId', 'e':'click'}));
>    // ... more event registrations and onDomReady scripts }
>
> I'm assuming that, being generated in the this event registration code
> happens for all components that are added explicitly, but not for any
> components that are added dynamically by me.
>
> How can I call the new container with the Ajax behaviors or change the
> current implementation so the wicket Ajax behaviors would be called?
>
>
> To be more precise I have a table with a filter which rendered by replacing
> web markup container with this TableWithFilter. This scenario happens on
> Ajax so when the page loaded by the first time the TableWithFilter does not
> exist, it will appear on screen due to Ajax request that will occur
>
> TableWithFilter contains AbstractFilterPanel which has a org.apache.wicket.
> ajax.markup.html.form.AjaxButton which render the table by Ajax the button
> is
>
> initilze in the c'tor like this :
>
> public abstract class AbstractFilterPanel extends Panel {
> public AbstractFilterPanel(String id, IModel<?> model, BMDefaultDataGrid
> toRender, SearchCriteria searchCriteriaIn, FeedbackPanel feed) {
>   super(id, model);
>   this.tableTorender = toRender;
>   this.setSearchCriteria(searchCriteriaIn);
>   this.feedbackPanel = feed;
>
> }
> //called by the AbstractFilterPanel sons
>   protected void init() {
>   Injector.get().inject(this);
>   setOutputMarkupId(true);
>   form = new ExpendedForm(FORM);
>   form.setOutputMarkupId(true);
>   form.setMarkupId("fillter-form");
>   add(form);
>
>   new AjaxButton(SUBMIT_FILLTER_FORM, form) {
>
> private static final long serialVersionUID = 1L;
>
>
> @Override
>
> protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
>
> getSearchCriteria().clear();
>
> onFillterSubmited();
>
> if (getPreDefinedSearchCriteria() != null) {
>
> getSearchCriteria().and(getPreDefinedSearchCriteria());
>
> }
>
> toRender.resetSelectedItems();
>
> target.add(toRender);
>
> toRender.resetCurrentPage();
>
> target.add(feedbackPanel);
>
> }
>
> @Override
>
> protected void onError(AjaxRequestTarget target, Form<?> form) {
>
> target.add(feedbackPanel);
>
> }
>
> @Override
>
> public boolean isEnabled() {
>
> return super.isEnabled() && isApplyBtnEnabled();
>
> }
>
> }
>
> }
>
> what should AbstractFilterPanel implement in order to add a javascript that
> register his appaly btn when it's rendered on page ?
>
>
> Thanks in advance.
>