I've had a few requests about this, so here is an update with an
easy-to-implement solution. It can be used to execute any arbitrary
JavaScript as part of an AJAX return. I simply use the standard
renderSupport.addScript() method.
I created a component called "executescript":
public class ExecuteScript
{
@Parameter(defaultPrefix=BindingConstants.LITERAL) private String
script;
@Environmental
private RenderSupport renderSupport;
@BeforeRenderTemplate
public void addScript()
{
System.out.println("script: "+script);
if(!Util.isBlank(script)) renderSupport.addScript(script);
}
}
(It has a simple mostly-empty "tml" file to go with it.)
Then, to use it, I add this to a page or component:
In the tml:
<t:zone id="myZone" t:id="myZone">
<t:executeScript script="prop:execScript"/>
</t:zone>
In the Java:
@Property @InjectComponent private Zone myZone;
@Property private String execScript;
public Object onCloseWindow()
{
execScript = "theIdForMyWindow.close();"; // or any other javascript
that you would like to run
return myZone.getBody();
}
When the zone is rendered, the executescript component is rendered. That
the script to be executed is passed as a parameter and the component uses
renderSupport.addScript() to add the script to the ajax response. Tapestry
will then automatically execute this script as part of the ajax processing.
-Nathan
On Thu, Mar 11, 2010 at 2:23 AM, Nathan Kopp <[email protected]> wrote:
> I have a page that uses ChenilleKit to pop up a window that contains a
> component. That component contains a form enclosed in a zone. The form get
> submitted under a variety of circumstances primarily for the purpose of
> storing the state and redrawing the form based on some option the user just
> selected. This all works great. However, once the user has finally
> finished everything, I'd like for the final submit button to do something
> else other than just update the zone. I want it to cause the window to
> close and for another zone on the page, outside of the window, to be
> updated. And I need to make it close the ChenilleKit window. I haven't
> figured out how to make this happen yet.
>
> I think I figured out that I can pass a zone from the page to the inner
> component (which has the form) and then return a MultiZoneUpdate to update a
> part of the page that is not otherwise known by the inner component.
> However, I haven't been able to close the window using this method. I
> think I might need to trigger a javascript callback (like ChenilleKit's
> OnEvent mixin). Any ideas?
>
> -Nathan
>
>