Hi! > 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.
No. AjaxFormSubmittingChangeListenerBehavior does NOT validate the form. That is the whole point of the behavior. ** Martin > > 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 > > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org