Martin, I tried your approach it will not be working for me. Because I am going to add other required fields before or after the two dropdown list. Using AjaxFormSubmitBehavior would likely cause validation errors all the time.
Besides, AjaxFormComponentUpdatingBehavior should be what I need: redraw part of a web page via Ajax without submitting a form. Thank YOU for your help! All the best, David --- On Mon, 3/22/10, Martin Makundi <martin.maku...@koodaripalvelut.com> wrote: > From: Martin Makundi <martin.maku...@koodaripalvelut.com> > Subject: Re: Ajax has too much control? > To: users@wicket.apache.org > Date: Monday, March 22, 2010, 10:52 AM > Hi! > > If you redraw something, you need to submit the form > values, otherwise > the redrawn state is different... if that's your case. > > ** > Martin > > 2010/3/22 David Chang <david_q_zh...@yahoo.com>: > > > > Hello Martin, > > > > Thanks for your input and sharing your code! I will > give it a try. > > > > Did you have the same problem I have now? > > > > Here is what I have for the Country DDC: > > > > countryDDC.add(new > AjaxFormComponentUpdatingBehavior("onchange") { > > @Override > > protected void onUpdate(AjaxRequestTarget target) > { > > if (target != null) { > > MyUser u = form.getModelObject(); > > u.setState(null); > > DropDownChoice stateDDC = (DropDownChoice) > form.get("state"); > > > stateDDC.setChoices(objectService.findStatesForLocale(getSession().getLocale())); > > target.addComponent(countryDDC); > > target.addComponent(stateDDC); > > } > > } > > }); > > > > > > As you can see, I am using > AjaxFormComponentUpdatingBehavior. Why do you use > AjaxFormSubmitBehavior? In my case, I am not submitting a > form. > > > > I am new in Wicket. Thanks for your help! > > > > Best. > > -David > > > > > > > > > > > > --- On Sun, 3/21/10, Martin Makundi <martin.maku...@koodaripalvelut.com> > wrote: > > > >> From: Martin Makundi <martin.maku...@koodaripalvelut.com> > >> Subject: Re: Ajax has too much control? > >> To: users@wicket.apache.org > >> Date: Sunday, March 21, 2010, 11:38 AM > >> Hi David! > >> > >> Maybe you need this (at least this is what worked > for me): > >> > >> /** > >> * @author Martin > >> */ > >> public abstract class > >> AjaxFormSubmittingChangeListenerBehavior extends > >> AjaxFormSubmitBehavior { > >> private final static Method hiddenFieldGetter; > >> static { > >> try { > >> hiddenFieldGetter = > >> Form.class.getDeclaredMethod("getHiddenFieldId"); > >> > >> hiddenFieldGetter.setAccessible(true); > >> } catch (Exception e) { > >> throw new RuntimeException(e); > >> } > >> } > >> > >> /** > >> * @see > >> > org.apache.wicket.ajax.AbstractDefaultAjaxBehavior#onBind() > >> */ > >> @Override > >> protected void onBind() { > >> super.onBind(); > >> > >> if (!(getComponent() instanceof > >> IOnChangeListener)) > >> { > >> throw new > >> WicketRuntimeException("Behavior " + > getClass().getName() + > >> " can only be added to an > >> instance of a IOnChangeListener"); > >> } > >> } > >> > >> /** > >> * @param event > >> */ > >> public > >> AjaxFormSubmittingChangeListenerBehavior(String > event) { > >> super(event); > >> } > >> > >> /** > >> * @see > >> > org.apache.wicket.ajax.form.AjaxFormSubmitBehavior#onError(org.apache.wicket.ajax.AjaxRequestTarget) > >> */ > >> @Override > >> protected void onError(AjaxRequestTarget > target) { > >> onSubmit(target); > >> } > >> > >> /** > >> * @see > >> > org.apache.wicket.ajax.form.AjaxFormSubmitBehavior#onEvent(org.apache.wicket.ajax.AjaxRequestTarget) > >> */ > >> @Override > >> protected void onEvent(AjaxRequestTarget > target) { > >> HttpServletRequest httpServletRequest = > >> ((WebRequest) getComponent() > >> > >> .getRequest()).getHttpServletRequest(); > >> > >> Map parameters; > >> > >> if (httpServletRequest instanceof > >> MockHttpServletRequest) { > >> parameters = > >> ((MockHttpServletRequest) > >> httpServletRequest).getParameterMap(); > >> } else { > >> parameters = > >> ((org.mortbay.jetty.Request) > >> httpServletRequest).getParameters(); > >> } > >> > >> parameters.put(getHiddenFieldId(getForm()), > >> > getComponent().urlFor(IOnChangeListener.INTERFACE)); > >> > >> final FormComponent<?> formComponent > = > >> (FormComponent<?>) getComponent(); > >> > >> try { > >> if (isUpdateModel()) { > >> formComponent.inputChanged(); > >> formComponent.validate(); > >> > >> if > >> (!formComponent.hasErrorMessage()) { > >> formComponent.valid(); > >> > >> formComponent.updateModel(); > >> } > >> } > >> > >> super.onEvent(target); > >> } catch (RuntimeException e) { > >> > >> > Utils.errorLog(AjaxFormSubmittingChangeListenerBehavior.class, > >> e); > >> onError(target); > >> } > >> } > >> > >> /** > >> * @return boolean > >> */ > >> protected boolean isUpdateModel() { > >> return true; > >> } > >> > >> /** > >> * @param form > >> * @return String > >> */ > >> private String getHiddenFieldId(Form<?> > form) > >> { > >> try { > >> Form<?> root = > >> form.getRootForm(); > >> return (String) > >> hiddenFieldGetter.invoke(root); > >> } catch (Exception e) { > >> throw new RuntimeException(e); > >> } > >> } > >> } > >> > >> > >> public abstract class > >> > AjaxFormSubmittingChangeListenerDropDownChoice<T> > >> extends > >> DropDownChoice<T> { > >> /** Initialize */ { > >> add(new > >> > AjaxFormSubmittingChangeListenerBehavior(JavaScriptConstants.ONCHANGE) > >> { > >> @Override > >> protected void > >> onSubmit(AjaxRequestTarget target) { > >> > >> > AjaxFormSubmittingChangeListenerDropDownChoice.this.onSubmit(target); > >> } > >> }); > >> } > >> > >> /** > >> * @see > >> org.apache.wicket.MarkupContainer#toString() > >> */ > >> @Override > >> public String toString() { > >> return super.toString() + " Value: " + > >> getValue(); > >> } > >> > >> /** > >> * @param id > >> * @param choices > >> * @param renderer > >> */ > >> public > >> > AjaxFormSubmittingChangeListenerDropDownChoice(String id, > >> IModel<List<? extends T>> > >> choices, IChoiceRenderer<T> renderer) { > >> super(id, choices, renderer); > >> } > >> > >> /** > >> * @param target > >> */ > >> protected abstract void > onSubmit(AjaxRequestTarget > >> target); > >> > >> /** > >> * @param target > >> */ > >> protected void onError(AjaxRequestTarget > target) { > >> onSubmit(target); > >> } > >> > >> /** > >> * @param id > >> * @param choices > >> */ > >> public > >> > AjaxFormSubmittingChangeListenerDropDownChoice(String id, > >> IModel<List<? extends T>> > >> choices) { > >> super(id, choices); > >> } > >> > >> /** > >> * @param id > >> * @param model > >> * @param choices > >> * @param renderer > >> */ > >> public > >> > AjaxFormSubmittingChangeListenerDropDownChoice(String id, > >> IModel<T> model, > >> IModel<List<? extends T>> > >> choices, IChoiceRenderer<T> renderer) { > >> super(id, model, choices, renderer); > >> } > >> > >> /** > >> * @param id > >> * @param model > >> * @param choices > >> */ > >> public > >> > AjaxFormSubmittingChangeListenerDropDownChoice(String id, > >> IModel<T> model, > >> IModel<List<? extends T>> > >> choices) { > >> super(id, model, choices); > >> } > >> > >> /** > >> * @param id > >> * @param model > >> * @param data > >> * @param renderer > >> */ > >> public > >> > AjaxFormSubmittingChangeListenerDropDownChoice(String id, > >> IModel<T> model, > >> List<? extends T> data, > >> IChoiceRenderer<T> renderer) { > >> super(id, model, data, renderer); > >> } > >> > >> /** > >> * @param id > >> * @param model > >> * @param choices > >> */ > >> public > >> > AjaxFormSubmittingChangeListenerDropDownChoice(String id, > >> IModel<T> model, > >> List<? extends T> choices) { > >> super(id, model, choices); > >> } > >> > >> /** > >> * @param id > >> * @param data > >> * @param renderer > >> */ > >> public > >> > AjaxFormSubmittingChangeListenerDropDownChoice(String id, > >> List<? extends T> data, > >> IChoiceRenderer<T> renderer) { > >> super(id, data, renderer); > >> } > >> > >> /** > >> * @param id > >> * @param choices > >> */ > >> public > >> > AjaxFormSubmittingChangeListenerDropDownChoice(String id, > >> List<? extends T> choices) { > >> super(id, choices); > >> } > >> > >> /** > >> * @param id > >> */ > >> public > >> > AjaxFormSubmittingChangeListenerDropDownChoice(String id) { > >> super(id); > >> } > >> } > >> > >> > >> ** > >> Martin > >> 2010/3/21 Sven Meier <s...@meiers.net>: > >> > David, > >> > > >> >>It seems that you do not understand the > problem I > >> have > >> > > >> > obviously not ;). > >> > > >> > A quickstart would help me to understand your > problem > >> better, but perhaps > >> > others have already a clue? > >> > > >> > Sven > >> > > >> > David Chang wrote: > >> >> > >> >> Sven, > >> >> > >> >> Thanks for your input. It seems that you > do not > >> understand the problem I > >> >> have (Wicket problem??? or my page > problem???). I > >> know how Ajax works by > >> >> adding components to Ajax request > target. > >> >> > >> >> When it is non-Ajax, my page runs > correctly with > >> all three controls. When > >> >> Country DDC Ajax-controls State DDC, the > two DDC > >> works correctly. The > >> >> problem is that once this Ajax control > is > >> triggered by selecting a value in > >> >> Country DDC, the State DDC list is NOT > updated > >> when the Locale DDC value is > >> >> changed. > >> >> > >> >> I have a feel that Wicket has a problem > here. I am > >> using Wicket 1.4.7. > >> >> > >> >> Regards. > >> >> -David > >> >> > >> >> > >> >> > >> >> --- On Sun, 3/21/10, Sven Meier <s...@meiers.net> > >> wrote: > >> >> > >> >> > >> >>> > >> >>> From: Sven Meier <s...@meiers.net> > >> >>> Subject: Re: Ajax has too much > control? > >> >>> To: users@wicket.apache.org > >> >>> Date: Sunday, March 21, 2010, 7:25 > AM > >> >>> Hi David, > >> >>> > >> >>> > >> > DropDownChoice#wantOnSelectionChangedNotifications() will > >> >>> trigger rendering of the complete > page. > >> >>> On Ajax request only those components > are > >> rendered you > >> >>> explicitely 'add' to the request, > see > >> AjaxRequestTarget#addComponent(). > >> >>> > >> >>> If you want to have the same for > Ajax > >> requests, you can > >> >>> just 'add' the complete page. > >> >>> > >> >>> This is not very efficient though. > >> >>> > >> >>> Sven > >> >>> > >> >>> David Chang wrote: > >> >>> > >> >>>> > >> >>>> Forgive me about this meaningless > subject, > >> but I > >> >>>> > >> >>> > >> >>> cannot think of a better one. > >> >>> > >> >>>> > >> >>>> I have been learning Wicket > through the > >> WIA book. I > >> >>>> > >> >>> > >> >>> just found out something interesting > to me. > >> Not sure it is a > >> >>> bug, design, or something I did > wrong. > >> >>> > >> >>>> > >> >>>> I have a page with three Wicket > elements: > >> >>>> > >> >>>> 1. Locale selector through a > >> DropDownChoice list. WIA > >> >>>> > >> >>> > >> >>> has complete code about how this > works and I > >> copied the > >> >>> solution into this page > >> >>> > >> >>>> > >> >>>> 2. Country DropDownChoice, whose > values > >> change between > >> >>>> > >> >>> > >> >>> English and Chinese depending on > Locale DDC. > >> >>>> > >> >>>> 3. State DropDownChoice, whose > values > >> change between > >> >>>> > >> >>> > >> >>> English and Chinese depending on > Locale DDC. > >> The values in > >> >>> this DDC depends on the chosen value > in > >> Country DDC. > >> >>> > >> >>>> > >> >>>> Here are the experiments > >> >>>> > >> >>>> Experiment#1. > >> >>>> > >> >>>> Country DDC does not control > values in > >> State DDC via > >> >>>> > >> >>> > >> >>> Ajax and it has > >> >>>> > >> >>>> protected boolean > >> >>>> > >> >>> > >> >>> wantOnSelectionChangedNotifications() > { > >> >>> > >> >>>> > >> >>>> return true; > >> >>>> } > >> >>>> > >> >>>> Everything works like a charm, > which > >> means > >> >>>> (1) when Country DDC value > changes, State > >> DDC changes > >> >>>> > >> >>> > >> >>> accodingly. > >> >>> > >> >>>> > >> >>>> (2) when Locale changes, both > Country DDC > >> and State > >> >>>> > >> >>> > >> >>> DDC lists change display values > accordingly > >> (which means > >> >>> both DDCs show a list of values in > the same > >> language). > >> >>> > >> >>>> > >> >>>> Experiment#2. > >> >>>> > >> >>>> Country DDC controls values in > State DDC > >> via Ajax. In > >> >>>> > >> >>> > >> >>> this case, when page is first loaded, > I do not > >> touch the > >> >>> Country DDC or State DDC. I simply > change > >> locale value any > >> >>> number of times, both Country DDC and > State > >> DDC lists change > >> >>> correctly depending on the session > locale. > >> Here is the > >> >>> strange thing. Then I change Country > DDC > >> value, State DDC > >> >>> changes correctly. Since then, > HOWEVER, if I > >> change locale > >> >>> values, ONLY Country DDC list > changes > >> correctly; State DDC > >> >>> list is not updated. It seems Wicket > decides > >> that State DDC > >> >>> is forever Aja-controlled by Country > DDC > >> only. > >> >>> > >> >>>> > >> >>>> Not qure sure if this a bug, > design, or I > >> did > >> >>>> > >> >>> > >> >>> something wrong. > >> >>> > >> >>>> > >> >>>> Please let me if you have > difficulty > >> understanding the > >> >>>> > >> >>> > >> >>> experiments. > >> >>> > >> >>>> > >> >>>> Thanks for any info or help. > >> >>>> > >> >>>> Cheers! > >> >>>> > >> >>>> > >> >>>> > >> >>>> > >> >>>> > >> >>>> > >> >>> > >> >>> > >> > --------------------------------------------------------------------- > >> >>> > >> >>>> > >> >>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > >> >>>> For additional commands, e-mail: > users-h...@wicket.apache.org > >> >>>> > >> >>>> > >> >>>> > >> >>> > >> >>> > >> > --------------------------------------------------------------------- > >> >>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > >> >>> For additional commands, e-mail: users-h...@wicket.apache.org > >> >>> > >> >>> > >> >>> > >> >> > >> >> > >> >> > >> >> > >> > --------------------------------------------------------------------- > >> >> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > >> >> For additional commands, e-mail: users-h...@wicket.apache.org > >> >> > >> >> > >> > > >> > > >> > > >> > --------------------------------------------------------------------- > >> > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > >> > For additional commands, e-mail: users-h...@wicket.apache.org > >> > > >> > > >> > >> > --------------------------------------------------------------------- > >> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > >> For additional commands, e-mail: users-h...@wicket.apache.org > >> > >> > > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > > For additional commands, e-mail: users-h...@wicket.apache.org > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > For additional commands, e-mail: users-h...@wicket.apache.org > > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org