You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Kim Thrysøe <kt...@atira.dk> on 2006/11/21 15:15:03 UTC

Trouble updating component after async. directlink : clientId's generated in For-loops

In a page containing elements generated by a component placed under a 
For-Loop component I want to be able to update a single such 
component/element using the very nifty 
"DojoAjaxResponseBuilder.updateComponent()"  feature.

In summary I want to have a DirectLink for each row in a table. The 
listener method for this DirectLink will update data, the row should be 
updated via the updateComponents attribute of DirectLink.

But... how do I address components generated (and thus named) by a 
For-loop?
updateComponents="therow" will work for first row
updateComponents="therow_2" does not work at all (sends updates to the 
Insert and DirectLink components in stead!
updateComponents="ognl:'therow_' + theIndex"  has the same behaviour. .

Hopefully this small example illustrates my issue: one column for data 
one for the async DirectLink to listener "aListener". This code works 
for the _first_ row but not the other two.

*The html*
<div jwcid="@Shell" title="Test">
     <div jwcid="@Body" class="templatewide">
     
        <table border="1" cellpadding="5">
   
            <span jwcid="@For" source="ognl:rows" value="ognl:row" 
index="ognl:theIndex">
            <tr jwcid="therow@Any">
                <td>
                    <span jwcid="@Insert" value="ognl:row"> </span>
                </td>
                <td>
                    <a jwcid="@DirectLink"
                        listener="listener:aListener"
                        async="true"
                        parameters="ognl:{theIndex}"
                        updateComponents="rowid">
                        Update this row!
                    </a>
                </td>
            </tr>
            </span>
       
        </table>

    </div>
</div>

*The Page Class*
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.annotations.Persist;
import org.apache.tapestry.event.PageEvent;

import dk.atira.tapestry.AbstractBasePage;

public abstract class NumericPage extends AbstractBasePage {

    @Persist
    public abstract String[] getRows();
    public abstract void setRows(String[] rows);
   
    public abstract String getRow();
    public abstract int getTheIndex();
   
    @Override
    public void pageBeginRender(PageEvent e)
    {
        if (getRows() == null){
            setRows(new String[] {"foo", "bar", "baz"});
        }
    }
   
    public void aListener(IRequestCycle cycle, int idx)
    {
        getRows()[idx] = "" + (int)(Math.random()*10000);
    }
   
}

/thanks
kim

-- 
Tlf. +45 7214 6793 · kt@atira.dk · MSN: kim.thrysoe@acm.org
Atira A/S · Niels Jernes Vej 10 · 9220 Aalborg SØ · www.atira.dk


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


Re: Trouble updating component after async. directlink : clientId's generated in For-loops

Posted by Kim Thrysøe <kt...@atira.dk>.
Thank you for the response. That is exactly what I wanted.

But ... something is still odd. I get too and mixed up updates back to 
in the ajax-response requests. Is this a bug or expected behaviour?

_Click on first row :_
Tapestry / DojoAjaxResponseBuilder sends
* <response id="therow" type="element">  (actually containing both first 
and second row(!)
* <response id="initializationscript" type="script">
Works fine.

_Click on second row :_
* <response id="Insert" type="element">
* <response id="therow_0" type="element">
* <response id="DirectLink" type="element"> ie. of first row
* <response id="initializationscript" type="script">
DOJO warns: WARNING: 10:06:53 AM: No node could be found to update 
content in with id Insert

_Click on third row :_
<response id="Insert_1" type="element">
* <response id="DirectLink_0" type="element">
* <response id="initializationscript" type="script">
DOJO warns: WARNING: 10:05:40 AM: No node could be found to update 
content in with id Insert_1

/kim


andyhot wrote:
> Sam Gendler wrote:
>   
>> On 11/21/06, andyhot <an...@di.uoa.gr> wrote:
>>     
>>> updateComponents="ognl:components.therow.clientId"
>>>
>>>       
>> Can I suggest that we get this into the docs in some way.  It stumps a
>> lot of people, including myself.
>>     
>
> http://issues.apache.org/jira/browse/TAPESTRY-1137 proposes a binding
> for that
> exact use-case, i.e. updateComponents="clientId:therow"
>
>
>   
>> Also, it seems like if I want to
>> update a component by calling ResponseBuilder.updateComponent() from
>> within a listener method, I have to give it the id of the component,
>> rather than the clientId.  In that case, does it only update the
>> current instance of the component accessed by that id, or will it
>> update every component that uses that id as the code iterates over a
>> collection in some way? If it is the former, how would I update the
>> row that follows the current row?  Is it even possible?
>>
>> --sam
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
>> For additional commands, e-mail: users-help@tapestry.apache.org
>>
>>
>>     
>
>
>   


-- 
Tlf. +45 7214 6793 · kt@atira.dk · MSN: kim.thrysoe@acm.org
Atira A/S · Niels Jernes Vej 10 · 9220 Aalborg SØ · www.atira.dk


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


Re: Trouble updating component after async. directlink : clientId's generated in For-loops

Posted by andyhot <an...@di.uoa.gr>.
Sam Gendler wrote:
> On 11/21/06, andyhot <an...@di.uoa.gr> wrote:
>> updateComponents="ognl:components.therow.clientId"
>>
>
> Can I suggest that we get this into the docs in some way.  It stumps a
> lot of people, including myself.

http://issues.apache.org/jira/browse/TAPESTRY-1137 proposes a binding
for that
exact use-case, i.e. updateComponents="clientId:therow"


> Also, it seems like if I want to
> update a component by calling ResponseBuilder.updateComponent() from
> within a listener method, I have to give it the id of the component,
> rather than the clientId.  In that case, does it only update the
> current instance of the component accessed by that id, or will it
> update every component that uses that id as the code iterates over a
> collection in some way? If it is the former, how would I update the
> row that follows the current row?  Is it even possible?
>
> --sam
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>


-- 
Andreas Andreou - andyhot@apache.org - http://andyhot.di.uoa.gr
Tapestry / Tacos developer
Open Source / J2EE Consulting 


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


Re: Re: Trouble updating component after async. directlink : clientId's generated in For-loops

Posted by Sam Gendler <sg...@ideasculptor.com>.
On 11/21/06, andyhot <an...@di.uoa.gr> wrote:
> updateComponents="ognl:components.therow.clientId"
>

Can I suggest that we get this into the docs in some way.  It stumps a
lot of people, including myself.  Also, it seems like if I want to
update a component by calling ResponseBuilder.updateComponent() from
within a listener method, I have to give it the id of the component,
rather than the clientId.  In that case, does it only update the
current instance of the component accessed by that id, or will it
update every component that uses that id as the code iterates over a
collection in some way? If it is the former, how would I update the
row that follows the current row?  Is it even possible?

--sam

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


Re: Trouble updating component after async. directlink : clientId's generated in For-loops

Posted by andyhot <an...@di.uoa.gr>.
updateComponents="ognl:components.therow.clientId"


Kim Thrysøe wrote:
> In a page containing elements generated by a component placed under a
> For-Loop component I want to be able to update a single such
> component/element using the very nifty
> "DojoAjaxResponseBuilder.updateComponent()"  feature.
>
> In summary I want to have a DirectLink for each row in a table. The
> listener method for this DirectLink will update data, the row should
> be updated via the updateComponents attribute of DirectLink.
>
> But... how do I address components generated (and thus named) by a
> For-loop?
> updateComponents="therow" will work for first row
> updateComponents="therow_2" does not work at all (sends updates to the
> Insert and DirectLink components in stead!
> updateComponents="ognl:'therow_' + theIndex"  has the same behaviour. .
>
> Hopefully this small example illustrates my issue: one column for data
> one for the async DirectLink to listener "aListener". This code works
> for the _first_ row but not the other two.
>
> *The html*
> <div jwcid="@Shell" title="Test">
>     <div jwcid="@Body" class="templatewide">
>            <table border="1" cellpadding="5">
>              <span jwcid="@For" source="ognl:rows" value="ognl:row"
> index="ognl:theIndex">
>            <tr jwcid="therow@Any">
>                <td>
>                    <span jwcid="@Insert" value="ognl:row"> </span>
>                </td>
>                <td>
>                    <a jwcid="@DirectLink"
>                        listener="listener:aListener"
>                        async="true"
>                        parameters="ognl:{theIndex}"
>                        updateComponents="rowid">
>                        Update this row!
>                    </a>
>                </td>
>            </tr>
>            </span>
>              </table>
>
>    </div>
> </div>
>
> *The Page Class*
> import org.apache.tapestry.IRequestCycle;
> import org.apache.tapestry.annotations.Persist;
> import org.apache.tapestry.event.PageEvent;
>
> import dk.atira.tapestry.AbstractBasePage;
>
> public abstract class NumericPage extends AbstractBasePage {
>
>    @Persist
>    public abstract String[] getRows();
>    public abstract void setRows(String[] rows);
>      public abstract String getRow();
>    public abstract int getTheIndex();
>      @Override
>    public void pageBeginRender(PageEvent e)
>    {
>        if (getRows() == null){
>            setRows(new String[] {"foo", "bar", "baz"});
>        }
>    }
>      public void aListener(IRequestCycle cycle, int idx)
>    {
>        getRows()[idx] = "" + (int)(Math.random()*10000);
>    }
>   }
>
> /thanks
> kim
>


-- 
Andreas Andreou - andyhot@apache.org - http://andyhot.di.uoa.gr
Tapestry / Tacos developer
Open Source / J2EE Consulting 


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