如何从容器触发操作时更新组件内的区域

时间:2010-12-23 16:13:31

标签: ajax tapestry

我有一个页面:Test.tml,其中包含一个选择和一个组件:

       <t:zone t:id="zone1" t:clientId="zone1">
        <form t:id="form" id="form" method="post">
            <p>
                <select t:type="select" t:id="simpleSelect" t:clientId="simpleSelect" t:value="simpleSelect" t:model="selectList" t:zone="zone1" />
            </p>
        </form>
  <div t:type="SimpleTestComponent" t:id="simpleTestComponent" ></div>
</t:zone>

在Test.java中,我抓住了这个事件:

@OnEvent(value = EventConstants.VALUE_CHANGED, component = "simpleSelect")
public Object changeOnSelect(String value) {
    return zone1.getBody();
}

哪个更新了zone1

我有一个组件,它还包含一个select和一个要更新的区域;组件选择的内容取决于容器选择表单值,因此我还需要更新组件的内容。如果我的组件中没有区域,那么它运行良好,但情况并非如此。

在SimpleTestComponent.tml中,我有:

   <form t:id="form" id="form" method="post">
        <p>
            <select t:type="select" t:id="nameSelect" t:clientId="nameSelect" t:value="nameSelected" t:model="nameList" t:zone="zoneComponent"/>
        </p>
    </form>
     <t:zone t:id="zoneComponent" t:clientId="zoneComponent">
    <p>${nameSelected}</p></t:zone>

并在SimpleTestComponent.java =&gt;

@OnEvent(value = EventConstants.VALUE_CHANGED, component = "nameSelect")
public Object valueChanged() {
    return zoneComponentId.getBody();
}

我抓住了选择更改,并更新了值。

我现在想要的是,当从Test.tml更改select时,还能够更新SimpleTestComponent的内容。如果我在zone1中包含simpleTestComponent,我有一个错误,关于simpleTestComponent内的区域,当我在Test.java中触发valueChanged事件时,我返回一个MultiZoneUpdate,带有zone1和组件区域(我在区域组件上放置一个公共getter) ,我也有错误,所以解决方案是什么......?

我不确定是非常清楚,因为阅读。 :)

1 个答案:

答案 0 :(得分:2)

您需要使嵌入区域(zoneComponent)可用于包含组件:

public class SimpleTestComponent
{
    public Zone getZoneComponent()
    {
        return zoneComponentId;
    }
}

然后从Test类中的事件处理程序返回该区域:

public class Test
{
    @InjectComponent
    private SimpleTestComponent simpleTestComponent;

    @OnEvent(value = EventConstants.VALUE_CHANGED, component = "simpleSelect")
    public Object changeOnSelect(String value)
    {
        return simpleTestComponent.getZoneComponent();
    }
}