我的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);
}
}
答案 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,特别是“参数是双向”一节。