Hi All!

I struggeld with something similar for some days maybe it helps you to see how I solved my problem and maybe you can reuse something...Basically I tried to find a work around for the autocomplete mixin limitations, which just accepts string as return type, thus rendering complex values is nearly impossible.

The Bind mixin provides several parameters: zone, callback, context.
To pass the current content of a input field back to Tapestry I used:

... t:mixins="jquery/bind" bind.event="change" bind.eventType="keyup" bind.zone="schoolSearchResultZone" bind.callback="function (event,ui,url) { x = $('#schoolTextField').val(); url.addContext(x); }" ...

"bind.context" just passes the initial value back, which is useable to pass static state back, but I needed the latest value from the input field. Using the code above I get a callback when the user types a character in the input field (field assigned with id "schoolTextField").

"url.addContext" replaces "COntEXt" (used internally by bind) by the value of my input field. Therefore a java function "public Object onChange(final String searchText)" is called. Be careful: in case the input field is empty the "dynamic context" misses and the required function signature is: "public Object onChange()". I decided to have two java methods but you can use JavaScript to avoid calls when no input was made, too.

My method

public Object onChange(final String searchText)
{
    // do something with searchText...
    return schoolSearchResultZone.getBody();
}

returns a zone and allows me to render whatever I need in which form I want. So it works like "autocomplete" but fits more the entire page design :-)


The zone itself is defined in my page by

    @InjectCompenent private Zone _schoolSearchResultZone;

and the corresponding tml fragment is:

<div t:type="zone" id="schoolSearchResultZone" t:id="schoolSearchResultZone">
        ... loop whatever ...
    </div>



Be careful, the context (searchText) is not encoded properly yet, so german umlauts will fail. But I'll figure this out next...



Jens





Am 22.05.13 09:47, schrieb Emmanuel DEMEY:
but I think the value of your sent will not be sent.  I have just pushed a
small patch : https://github.com/got5/tapestry5-jquery/issues/295

Can you test it ?

Manu


2013/5/22 Barry Books <trs...@gmail.com>

You have to pass in the context

<t:textfield class="${selector:this}" t:id="textZone"
t:mixins="jquery/bind" t:event="change" t:eventType="change" t:zone="zone"
t:context="myContext" />


On Tue, May 21, 2013 at 2:23 PM, Boris Horvat <horvat.z.bo...@gmail.com
wrote:
Well spoke too soon

<t:zone t:id="zone" id="zone">
             <div id="status">${textZone}</div>
</t:zone>
<t:form>
       <t:textfield class="${selector:this}" t:id="textZone"
t:mixins="jquery/bind" t:event="change" t:eventType="change"
t:zone="zone"
/>
</t:form>

------

     @Property
     @Persist
     private String textZone;
     @InjectComponent
     private Zone zone;

     @OnEvent(value = "change")
     public Object change(String value) {
         textZone = value;
         return zone.getBody();
     }

This doesn't work as the context is not passed. In other words if I
remove
the parameter the method is hit if not I get the exception that there is
no
method to process the request. So I guess I am half say there.

Barry did you by any chance had a test where you pass the parameter.

PS Looking into the javascript url generated by the tapestry5-jquery
http://tapestry5-jquery.com/mixins/docsbind:slidechange/CoNtExT and mine
http://localhost:8080/healthstatus:change I think that for some reason I
am
missing the parameter that should tell it to insert context. So a bug
maybe?

Cheers


On Tue, May 21, 2013 at 9:01 PM, Boris Horvat <horvat.z.bo...@gmail.com
wrote:
Nah that is not the problem.

When I have changed from onchange to change it triggered the ajax
request.
So I guess I should remove 'on' from my events.

Thanks for help your example shad light on this :D

Cheers


On Tue, May 21, 2013 at 8:55 PM, Jan Fryblik <jan.fryb...@ebrothers.cz
wrote:


I'm just guessing, but try to put there also attribute id. Its often
worked for me.


<t:zone t:id="zoneSlideChange" id="zoneSlideChange">

             <div id="status">${textZone}</div>
</t:zone>

<t:form>
<t:textfield t:id="textZone" t:mixins="jquery/bind"
                 event="onchange" eventType="onfocus" zone="testzone"/>
</t:form>


BR,
Jan






On Tue, 21 May 2013 20:49:56 +0200, Boris Horvat <
horvat.z.bo...@gmail.com> wrote:

  I have tried with prefix t: and it has nothing to do with that (it is
not
really mandatory as far as I know). But I stilled tried it. The zone
name
is also correct. The thing is that when I try to debug it the even it
never
triggered, so it cant be the zone related problem that is for sure.


On Tue, May 21, 2013 at 8:31 PM, Dmitry Gusev <
dmitry.gu...@gmail.com
wrote:
  Is it  zone="testzone" vs  t:zone="testzone" ?
the same for these attributes:  event="onchange" eventType="onfocus"

looks like you forget to add "t:" prefix

Also make sure you've specified correct zone client id, try the same
as
in
Barry's example, using ${zoneSlideChange.clientId}.

On Tue, May 21, 2013 at 9:48 PM, Boris Horvat <
horvat.z.bo...@gmail.com
wrote:
Yea your example works, but mine does not and I cant see any
difference.
Do
you have any idea?


On Tue, May 21, 2013 at 4:34 AM, Barry Books <trs...@gmail.com>
wrote:
   Here is my old test case

<t:zone t:id="clickZone" visible="false">
                         click OK
                  </t:zone>

                 <div t:id="clickHere" t:type="any"
  t:mixins="jquery/bind"
                         t:eventType="click" t:event="click"
t:zone="${clickzone.clientid}"
                  >click test</div>

@InjectComponent
         @Property
         private org.apache.tapestry5.corelib.**components.Zone
clickZone;
         @Inject
         private Logger logger;

         @OnEvent(value="click")
         Object onClick() {
                 return clickZone.getBody();
         }



On Mon, May 20, 2013 at 11:58 AM, Boris Horvat <
horvat.z.bo...@gmail.com
wrote:
Did anyone used this?

I cant use the example in the tapestry5-jquery as it complains
that
slider
is not a mixin, so I guess that the example is old as slider
is
now a
component. Still I have tried to use

<t:zone t:id="zoneSlideChange">
             <div id="status">${textZone}</div>
</t:zone>

<t:form>
<t:textfield t:id="textZone" t:mixins="jquery/bind"
                 event="onchange" eventType="onfocus"
zone="testzone"/>
</t:form>

----------------

@Property
     @Persist
     private String textZone;
     @InjectComponent
     private Zone zone;

     @OnEvent(value = "onchange")
     public Object onchange(String value) {
         textZone = "The SlideChange event was triggered.";
         return zone.getBody();
     }

Does anyone know where is the problem?

Cheers
Boris



--
Sincerely
*Boris Horvat*



--
Dmitry Gusev

AnjLab Team
http://anjlab.com




--
Sincerely
*Boris Horvat*



--
Sincerely
*Boris Horvat*





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

Reply via email to