Thanks for the ideas Josh, Hopefully I can get some use out of them...

I am creating the Ajax.Request myself as this is essentially what the Autocompleter does which is the best example I can find. I am infact extending the Autocompleter so that I can trigger an Ajax communication when an item is selected from the autocomplete suggestions. Essentially this is the same as having an actionlink, in that I am using ComponentResources.createEventLink().toAbsoluteURI() to determine the URL to call via Ajax.Request. The listener on the other end returns the MultiZoneUpdate.

I've tried injecting RenderSupport:
@Inject private RenderSupport renderSupport;

But the following exception is thrown:

Caused by: java.lang.RuntimeException: No object of type org.apache.tapestry5.RenderSupport is available from the Environment. Available types are org.apache.tapestry5.services.ComponentEventResultProcessor. at org.apache.tapestry5.internal.services.EnvironmentImpl.peekRequired(EnvironmentImpl.java:79)
   at $Environment_128c8ccda65.peekRequired($Environment_128c8ccda65.java)
   at $Environment_128c8ccd9c6.peekRequired($Environment_128c8ccd9c6.java)
   at $RenderSupport_128c8ccda6d._delegate($RenderSupport_128c8ccda6d.java)
   at $RenderSupport_128c8ccda6d.addScript($RenderSupport_128c8ccda6d.java)
   at $RenderSupport_128c8ccda25.addScript($RenderSupport_128c8ccda25.java)

I believe this is because it's invalid in the context of a partial render (ajax server side event listener). Have you tried injecting RenderSupport and using it in your example 'Object onActionFromUpdate()' ? I don't think it would work, because it is essentially the same architecture as what I have, minus the actionlink component.

p.

Josh Canfield wrote:
I've recently come up with a solution for handling MultiZoneUpdate as the
response from an Ajax.Request.

I'm not sure I follow why you need to create your own Ajax.Request
instead of using one of the built-in action/event link components. You
can give it the name of one zone but return a MultiZoneUpdate
response.

(from tapestry core  MultiZoneUpdateDemo.tml )
    <t:actionlink t:id="update" zone="fred">update</t:actionlink>

(from tapestry-core MultiZoneUpdateDemo.java)
 Object onActionFromUpdate()
    {
        return new MultiZoneUpdate("fred", fredBlock).add("barney",
barneyBlock).add("dino", "His dog, Dino.");
    }

Now I need to add the ability to execute a script, generated (or values
populated) by the server.


@Inject RenderSupport and call the addScript methods. If you're using
the built-in components then they get handled by default. The code
that does that is in ZoneManager.processReply.

Is this what you are trying to do?

Josh

On Sun, May 23, 2010 at 5:13 PM, Paul Stanton <p...@mapshed.com.au> wrote:
Hi all,

I've recently come up with a solution for handling MultiZoneUpdate as the
response from an Ajax.Request.

I did this by creating the following javascript function and calling it in
Ajax.Request.onSuccess:

Tapestry.handleMultizoneUpdate = function (transport)
{
  var reply = transport.responseJSON;
  // copied from tapestry.js - ZoneManager.processReply
  // apparently exposed in t5.2
  Object.keys(reply.zones).each(function (zoneId) {
          var manager = Tapestry.findZoneManagerForZone(zoneId);
          if (manager) {
              var zoneContent = reply.zones[zoneId];
              manager.show(zoneContent);
          }
      });
};

Now I need to add the ability to execute a script, generated (or values
populated) by the server.

1. Where is the code that turns MultiZoneUpdate into JSON?
2. What is the best way to return a javascript snippet from a tapestry event
listener to the client and have it executed in an Ajax/XHR environment?

Thanks, p.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org





Reply via email to