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

Reply via email to