Fixed it! this looks like a bug in T5 to me ...

I was trying to pass a "PageResponse" object from the enclosing "Pager" 
component to the nested "Next" component. All three of these classes were in my 
web.components package. When I moved PageResponse to another package (in this 
case my *.model package) it worked as expected. To double check I moved it back 
and got the old and unhelpful error.

Should I raise a JIRA for this?

Thanks

Toby

----- Original Message ----
From: Toby Hobson <[EMAIL PROTECTED]>
To: Tapestry users <users@tapestry.apache.org>
Sent: Friday, 16 May, 2008 7:30:51 PM
Subject: Re: Making a property available to nested components

I've noticed something ... If I try to pass a string to the nested component it 
works as expected, it seems there is something about the PageResponse class 
that it doesn't like. But this is just a normal javabean :

public class PageResponse implements Serializable {
  
  public static final long serialVersionUID = 1L;
  private int startIndex;
  private int endIndex;
  
  ... getters/setters
}

Toby

----- Original Message ----
From: Toby Hobson <[EMAIL PROTECTED]>
To: Tapestry users <users@tapestry.apache.org>
Sent: Friday, 16 May, 2008 6:09:19 PM
Subject: Re: Making a property available to nested components

Thanks Robert I've had a look at that and managed to replace a page property 
with a value supplied by a component at runtime. One problem I've hit though is 
when I want to make a property available to a nested component. Probably best 
explained with the code! Basically i'm trying to write a simple pager which 
will provide previous and next buttons: I have a Pager component which should 
make a "PageResponse" object available to nested components (previous and 
next). 

Pager.java

    private PageResponse response; // This is basically the list of results 
from the datasource with startIndex, endIndex, totalRecords etc.

    @Inject
    private Environment environment;

    @SetupRender
    void setupRender() {
        response = ds.action(request);
    }
    
    @BeginRender
    void beginRender() {
        environment.push(PageResponse.class, response);
    }
    
    @AfterRender
    void afterRender() {
        environment.pop(PageResponse.class);
    }

I also have a "Previous" component which basically decides if it should render 
a "previous" actionLink on the page:

Previous.java

    @Environmental
    @Property
    private PageResponse response;
    
    public boolean render() {
        return response.getPageNumber() > 1;
    }

Previous.tml

    <t:if test="render()">
        <t:actionLink t:context="response.pageNumber" 
t:id="previoust">previous</t:actionLink>
    </t:if>

I also have a "next" component which is basically the same as above

Then on my admin page I have

    <t:pager t:id="pager">
        <t:previous id="previous" /> <t:next id="next" />
    </t:pager>

I was hoping that the "previous" component would be able to see the 
pageResponse object which is provided by the containing pager component. But I 
get a very strange and unhelpful error:

Render queue error in BeginRender[Admin:previous.if]: Failure readingparameter 
'test' of component Admin:previous.if: No object of 
typecom.thc.web.components.PageResponse is available from the 
Environment.Available types are 
com.thc.web.components.PageResponse,org.apache.tapestry.PageRenderSupport,org.apache.tapestry.ValidationDecorator,org.apache.tapestry.internal.services.ClientBehaviorSupport,org.apache.tapestry.services.Heartbeat.

So it's not available, but it is!! 

Can anyone see any glaring errors with this?

Thanks

Toby

----- Original Message ----
From: Robert Zeigler <[EMAIL PROTECTED]>
To: Tapestry users <users@tapestry.apache.org>
Sent: Friday, 16 May, 2008 3:32:00 PM
Subject: Re: Making a property available to nested components

Check out the environment service.

Robert

On May 16, 2008, at 5/169:23 AM , Toby Hobson wrote:

> I've managed to achieve something by making the "container" a  
> component AND a property on my test page:
>
> @Property
> @Component(id="container")
> private Container container;
>
> but this seems like a bit of a hack, there must be a neater way of  
> doing this!
>
> Toby
>
> ----- Original Message ----
> From: Toby Hobson <[EMAIL PROTECTED]>
> To: tapestry <users@tapestry.apache.org>
> Sent: Friday, 16 May, 2008 3:15:57 PM
> Subject: Making a property available to nested components
>
> Hi
>
> I am looking to achieve something similar to the way in which JSP  
> custom tags work - I would like to make a property of a component  
> available to nested components/markup e.g.
>
> TestPage.tml:
> <t:container value="container">
>    hello ${container.user.name}
> </t:container>
>
> Container {
>  @Property
>  User user;
>
>  @PageAttached()
>  void attach() {
>  ... load and process "user"
>  }
> }
>
> But i can't find a way to do this. I know it can be done because the  
> loop component works like this.
>
> Does anyone have any ideas?
>
> Thanks
>
> Toby
>
>
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]










Reply via email to