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

Reply via email to