See my blog for a relevant implementation that has (among other things) a possible pattern to solve your problem. The pattern is to generating the action link with placeholders on page setup, pass it to javascript, and create a javascript function that replaces the placeholders runtime on client. Then wrap it in a component or a mixin.
http://tinybits.blogspot.com/2009/05/update-zone-on-any-client-side-event.html You could vote for this JIRA-issue, which also is a suggestion for making these things easier to do: https://issues.apache.org/jira/browse/TAP5-521 Inge On Thu, Nov 12, 2009 at 9:41 AM, Magnus Rundberget <run...@me.com> wrote: > Hi, > > > Others will surely correct me if I'm wrong... > - Ideally you should be able to create a mixin for the onclick event on the > actionlink that picks up the value of the textfield and sets the context > before the tapestry actionlink event triggers. However since the actionlink > is tied to a zone this is not so trivial. Something to do with > indeterministic ordering of events in javascript i believe > > > I can see a couple of other alternatives; > 1. Event and a little javascript using prototype and its inbuildt support > for ajax requests. Haven't tested the below so a big disclaimer here :-) > > A) Sample Javascript - checkusername.js; > CheckUserNameLink.prototype = { > initialize: function(elementId, requestUrl) > { > this.elementId = elementId; > this.requestUrl = requestUrl; > > Event.observe($(this.elementId), 'click', > this._click.bindAsEventListener(this)); > }, > _click: function(theEvent) > { > var url = this.requestUrl + "/" + encodeURIComponent($('userName')); > // adding the username as a context param to event > new Ajax.Request(this.requestUrl, { > method: 'get', > onSuccess: function(transport) { > var isTaken = transport.responseJSON.isTaken; > if (isTaken === 'true') { > // javascript to tell user the username is take... update a > div/span or whatever > } > } > }); > } > }; > > B) In your TML > remove the zone/replace with an empty div/span or whatever > <a href="#" > id="d="verifyDuplicatedUserName"">${message:verify-username-duplicated-link}</a> > > > C) In your page class > // above class definition > @IncludeJavaScriptLibrary({"context:js/checkusername.js"}) > > > // inside class body > private static final String CHECK_USER_NAME_EVENT = "checkusername"; > > @Inject > private RenderSupport renderSupport; > > @Inject > private ComponentResources componentResources; > > @AfterRender > void afterRender() { > Link link = > componentResources.createEventLink(CHECK_USER_NAME_EVENT); > renderSupport.addScript("new CheckUserNameLink('%s', '%s');", > "verifyDuplicatedUserName", link.toAbsoluteURI); > } > > @OnEvent(value = CHECK_USER_NAME_EVENT) > public Object onVerifyUserName(String userName) { > > //... do whatever you need to verify if username is taken > > // return result as json > JSONObject response = new JSONObject(); > response.put("isTaken", isTaken); > return response; > } > > > 2. Autocomple: You might use the autocomplete mixin for textfield ? > ...have to be creative to make it user friendly though ... > > > > cheers > rundis > > > > > > > I'm still getting started with Tapestry by doing some stuff, but... many >> questions. >> >> This one is in regards to AJAX. It's a "How to" kinda question. >> >> I Have a form like this in my page.tml: >> >> <form t:type="form" t:id="registrationForm" clientValidation="false"> >> <t:label for="userName" /> >> >> <input t:type="TextField" t:id="userName" value="user.name" >> t:validate="required, >> maxlength=15, minLength=3" size="15" /> >> <t:zone t:id="userNameDuplicatedNotice">${userExistMessage}</t:zone> >> >> <a t:type="actionlink" t:id="verifyDuplicatedUserName" >> context="literal:testing" >> href="#" >> t:zone="userNameDuplicatedNotice">${message:verify-username-duplicated-link}</a> >> >> <input type="submit" value="${message:label.submit.create.user}" /> >> >> </form> >> >> What I'm trying to figure out is: What is the best way to give the current >> value of textfield "userName" to the context of the link >> "verifyDuplicatedLogin"? >> >> Let me try to express with a user story: >> >> As a user I want to introduce a user name and click in a link to >> automatically(AJAX) receive a message informing me if the "userName" is >> already taken or not >> >> >> >> Thank you, >> >> jp >> > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org > For additional commands, e-mail: users-h...@tapestry.apache.org > >