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 <[email protected]> wrote:
> From: Martin Makundi <[email protected]>
> Subject: Re: Ajax has too much control?
> To: [email protected]
> 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 <[email protected]>:
> > 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 <[email protected]>
> wrote:
> >>
> >>
> >>>
> >>> From: Sven Meier <[email protected]>
> >>> Subject: Re: Ajax has too much control?
> >>> To: [email protected]
> >>> 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: [email protected]
> >>>> For additional commands, e-mail: [email protected]
> >>>>
> >>>>
> >>>>
> >>>
> >>>
> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: [email protected]
> >>> For additional commands, e-mail: [email protected]
> >>>
> >>>
> >>>
> >>
> >>
> >>
> >>
> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: [email protected]
> >> For additional commands, e-mail: [email protected]
> >>
> >>
> >
> >
> >
> ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [email protected]
> > For additional commands, e-mail: [email protected]
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]