Tapestry 5 - 两个组件之间的通信

时间:2011-07-18 13:45:49

标签: java tapestry

我的Java + Tapestry 5应用程序中有一个页面,其中包含两个组件 - 表单和网格。表单字段用于过滤网格中显示的结果。表单只是一个文本字段,用于设置映射到的对象A的值。网格是从对象A创建的。我需要从表单组件向网格组件发送正确的实例。做这个的最好方式是什么?我可以通过在上页设置对象来实现普通的旧java方式,但应该有一个更清洁的方式。我在考虑环境注释,但是不是太重了吗?

public class I1 {
    @Component
    private WFRFormFilter wfrFormFilter;

    @Component (parameters={ "wfrDataHolder=property:wfrFormFilter.wfrDataHolder" })
    private WFRResultTable wfrResultTable;
}

public class WFRFormFilter {
    @Inject
    private WFRService wfrservice;

    @Propperty
    @Persist
    private WFRDataHolder wfrDataHolder;

    @PageAttached
    void pageAttached() {
        if (wfrDataHolder == null) { 
            wfrDataHolder = new WFRDataHolder(); 
        }
    }

    @OnEvent(EventConstants.SUCCESS)
        void processMyForm() { }
}

public class WFRResultTable {
    @Parameter(defaultPrefix=BindingConstants.PROP)
    @Property
    private WFRDataHolder wfrDataHolder;

    @Inject
    private WFRService wfrservice;

    public List<WFRDataHolder> getResultTableData() {
        return wfrservice.getData(this.wfrDataHolder);
    }   
}

1 个答案:

答案 0 :(得分:3)

Tapestry的参数双向工作:如果将数据存储在页面类中(使用@Persist)并将其作为参数传递给表单组件,则可以在表单组件中更改其值,并且将自动反映到您的页面:不需要调用setter。

因此,如果您的页面和表单组件的布局如下:

 public class MyPage {

     @Component(parameters = "dataHolder=dataHolder")
     private MyForm formComponent;

     @Component(parameters = "dataHolder=dataHolder")
     private MyGrid gridComponent;

     @Persist
     @Property
     private MyDataHolder dataHolder;

}

public class MyFormComponent {

    @Parameter
    private MyDataHolder dataHolder;

    @OnEvent(EventConstants.SUCCESS)
    void formSubmitted() {
        this.dataHolder = new DataHolder(...);
    }

}

...然后,页面中将始终显示正确的值,因此也会出现在网格组件上。

另见Component Parameters page in the Tapestry docs,特别是“参数是双向”一节。