Tapestry
  1. Tapestry
  2. TAPESTRY-1054

DojoAjaxResponseBuilder will never render FormComponents

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 4.1.1
    • Fix Version/s: 4.1.1
    • Component/s: Framework
    • Labels:
      None

      Description

      DojoAjaxResponseBuilder uses the client id of a component to determine whether or not to render it (see the contains method). Form components (children of AbstractFormComponent) will always have a null client id at this point & hence will never be rendered.

      The form components seem to have a null client id because AbstractFormComponent has an abstract setClientId method. This causes tapestry to add a generated getClientId method that overrides the AbstractComponent.getClientId method. If you look at a form component in a debugger you can see the extra $clientId member variables that have been added to the concrete class.

      The AbstractFormComponent setClientId method is only invoked by renderIdAttribute. Obviously this happens after the DojoAjaxResponseBuilder calls getClientId to determine whether the component should be rendered.

      I think this can be fixed by removing the AbstractFormComponent setClientId method & adding a protected setClientId method to AbstractComponent (that just sets the _clientId member).

      This will result in DojoAjaxResponseBuilder calling AbstractComponent.getClientId & being returned the bound id or the IComponent.getId. Either of which should allow it to properly determine whether the component is supposed to be rendered or not.

      1. TapBug-1054.zip
        16 kB
        Ben Sommerville

        Activity

        Hide
        Jesse Kuhnert added a comment -

        Do you have an example where the current functionality breaks? I am currently able to update form components just fine using the ResponseBuilder semantics.

        Show
        Jesse Kuhnert added a comment - Do you have an example where the current functionality breaks? I am currently able to update form components just fine using the ResponseBuilder semantics.
        Hide
        Ben Sommerville added a comment -

        Example attached.

        Its fairly simple. There are two select inputs on the form, the goal is to update the options of the second select when the first select changes.

        Hopefully you'll look at it and tell me where I've gone wrong

        Show
        Ben Sommerville added a comment - Example attached. Its fairly simple. There are two select inputs on the form, the goal is to update the options of the second select when the first select changes. Hopefully you'll look at it and tell me where I've gone wrong
        Hide
        Jesse Kuhnert added a comment -

        Fixed. Applied suggested changes and it worked out. Thanks Will deploy it in a couple minutes.

        Show
        Jesse Kuhnert added a comment - Fixed. Applied suggested changes and it worked out. Thanks Will deploy it in a couple minutes.

          People

          • Assignee:
            Jesse Kuhnert
            Reporter:
            Ben Sommerville
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development