You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Portuendo Vestado <te...@yahoo.com.br> on 2007/03/16 03:16:56 UTC

Dynamic components with template (? extends BaseComponent)

Hi all,

I'm trying to find a way to have the Delegator component use some other
component with a template (chosen at runtime) to render output, and the
closest I found was using PageLoader's createImplicitComponent() function.
Is this correct for my intent? Are there more proper means of achieving the
same effect?

Technically I'm not trying to attach an implicit component to the page
dynamically - I simply want to be able to instantiate a regular component
with a template, and delegate rendering to it (or to one of several regular
components, chosen at runtime based on some criteria). 

Here's the code:

Home.java
[...]
	@InjectObject("service:tapestry.page.PageLoader")
	public abstract IPageLoader getPageLoader();

	public IRender getDynamicComponent() {
		return getComponent("whatever");
	}

	public void finishLoad(IRequestCycle cycle, IPageLoader loader,
IComponentSpecification specification) {
		super.finishLoad(cycle, loader, specification);

		IComponent iComponent =
getPageLoader().createImplicitComponent(getRequestCycle(), this, "whatever",
"layout/Test", getLocation());
		this.addComponent(iComponent);
	}
[...]


Home.html
[...]
<span jwcid="@Delegator" delegate="ognl:dynamicComponent"/>
[...]

This does delegate and produces output of whatever's in "layout/Test"
component's template.

Is there any downside to this approach (seems kinda hacky)? Or would a more
proper way be to actually implement my own IRender which reads from a
template somehow?


Thanks,
-p


		
_______________________________________________________ 
Yahoo! Mail - Sempre a melhor op��o para voc�! 
Experimente j� e veja as novidades. 
http://br.yahoo.com/mailbeta/tudonovo/
 


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


Re: Dynamic components with template (? extends BaseComponent)

Posted by Steve Shucker <ss...@vmsinfo.com>.
I don't know enough about tapestry internals to say if this is a good 
idea, but I've played around with DynamicBlock and your solution looks a 
lot simpler.  At a guess, it looks like your approach is setting up your 
dynamic component when tapestry is loading the page template.  If it's 
part of tapestry template cache, that means it would only pick the 
dynamic content the first time the page is loaded and reuse the same 
component on every subsequent call to the page - unless you're running 
in dev mode with page caching disabled.  But as I said, that's a guess.

If I'm wrong, I want to know how well does it handle things like 
RenderBody and passing parameters to your component?  If it handles 
those concerns well, I'm tempted to wrap it up into a generic 
DynamicComponent.

If I'm right, it probably jives with Howard's vision of static 
structure/dynamic behavior, but may not function in the way you intended.

-Steve

Portuendo Vestado wrote:
> Hi all,
>
> I'm trying to find a way to have the Delegator component use some other
> component with a template (chosen at runtime) to render output, and the
> closest I found was using PageLoader's createImplicitComponent() function.
> Is this correct for my intent? Are there more proper means of achieving the
> same effect?
>
> Technically I'm not trying to attach an implicit component to the page
> dynamically - I simply want to be able to instantiate a regular component
> with a template, and delegate rendering to it (or to one of several regular
> components, chosen at runtime based on some criteria). 
>
> Here's the code:
>
> Home.java
> [...]
> 	@InjectObject("service:tapestry.page.PageLoader")
> 	public abstract IPageLoader getPageLoader();
>
> 	public IRender getDynamicComponent() {
> 		return getComponent("whatever");
> 	}
>
> 	public void finishLoad(IRequestCycle cycle, IPageLoader loader,
> IComponentSpecification specification) {
> 		super.finishLoad(cycle, loader, specification);
>
> 		IComponent iComponent =
> getPageLoader().createImplicitComponent(getRequestCycle(), this, "whatever",
> "layout/Test", getLocation());
> 		this.addComponent(iComponent);
> 	}
> [...]
>
>
> Home.html
> [...]
> <span jwcid="@Delegator" delegate="ognl:dynamicComponent"/>
> [...]
>
> This does delegate and produces output of whatever's in "layout/Test"
> component's template.
>
> Is there any downside to this approach (seems kinda hacky)? Or would a more
> proper way be to actually implement my own IRender which reads from a
> template somehow?
>
>
> Thanks,
> -p
>
>
> 		
> _______________________________________________________ 
> Yahoo! Mail - Sempre a melhor opção para você! 
> Experimente já e veja as novidades. 
> http://br.yahoo.com/mailbeta/tudonovo/
>  
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>
>   

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