Tapestry 5组件的麻烦

时间:2013-08-11 19:03:52

标签: java tapestry

这是我想要解决的更大问题的一部分,但是如何做到这一点的逻辑思路将帮助我解决我需要的其余部分。

我想知道是否可以让用户从组件列表中进行选择,然后在页面上显示该组件?

例如,如果我有3个链接:

[Component 1]
[Component 2]
[Component 3]

如果用户选择“组件1”,我希望页面刷新并在页面上显示该组件。我想避免为每个组件创建一个单独的页面。我遇到的问题是,如果我在模板(.tml)中使用这样的东西:

<t:tools.HelloComponent> </t:tools.HelloComponent> 

然后硬编码总是显示一个组件。我无法在运行时更改.tml文件,因为这会影响所有用户。

我不确定最好的逻辑是什么,所以我只是在寻找一些一般指导。

1 个答案:

答案 0 :(得分:2)

您想要使用Blocks之类的声音。

一个块基本上是模板中的一块标记,它不会自动呈现,但可以在Java中引用并按需呈现。

因此,在您的情况下,您可能希望将每个组件放在页面模板中的自己的块中,并使用类似Delegate组件的内容来呈现正确的块,您可以在页面中的方法中决定Java(返回@Inject - ed块之一)

Page .tml

<t:block id="blockA">
    <t:tools.Component1 />
</t:block>

<t:block id="blockB">
    <t:tools.Component2 />
</t:block>

<t:block id="blockC">
    <t:tools.Component3 />
</t:block>

<t:delegate to="blockToRender"/> // chosen block will actually render here

Page Java

public class YourPage {

    @Inject private Block blockA;
    @Inject private Block blockB;
    @Inject private Block blockC;

    public Object getBlockToRender() {
        Block blockToRender;
        // logic here to set blockToRender to blockA, blockB or blockC
        return blockToRender
    }
}

如果不确切地知道你想在页面上做什么,很难对评论的实施情况做更具体的说明,但希望这可以指出你正确的方向。