【问题标题】:Tapestry 5 - communication between two componentsTapestry 5 - 两个组件之间的通信
【发布时间】:2011-07-18 13:45:48
【问题描述】:

我的 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);
    }   
}

【问题讨论】:

    标签: java tapestry


    【解决方案1】:

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

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

     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,尤其是“参数是双向的”部分。

    【讨论】:

    • 如果表单组件将 dataHolder 实例发送到 Environment 并且 Grid 组件使用 Environment 中的实例怎么办?该解决方案有任何问题吗? Tapestry 用户指南建议tapestry.apache.org/environmental-services.html
    • @Ondrej:这是可行的,但在普通参数可以正常工作的情况下使用它似乎很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2020-08-03
    • 2018-02-08
    • 2018-10-13
    • 1970-01-01
    • 2019-03-24
    相关资源
    最近更新 更多