Tapestry - 如何获取其他组件的字段

问题描述

我有一个加载变量的挂毯类

public class Component1 {
    Object onActionFromEdit(MyClass object){
        String param = object.getMyparam();
    ...}
}

我想从其他组件访问参数值。

获得它的最佳方式是什么? 是否有一些常见的上下文可以存储变量? 我试图搜索文档,但到目前为止没有运气。

解决方法

我认为您正在寻找允许您执行以下操作的 ComponentResources 类:

public class Component1 {

    @Inject
    private ComponentResources resources;
    
    Object onActionFromEdit(){
        MyComponent comp = (MyComponent) resources.getEmbeddedComponent("ComponentId");
        String param = comp.getMyParam();
    }
}

如果组件不是嵌入的而是同级的一部分,您也可以resources.getContainerResources().getEmbeddedComponent("ComponentId")甚至从页面中获取它,如下所示:resources.getPage().getComponentResources().getEmbeddedComponent("ComponentId")

,

难以猜测,但从名称 onActionFromEdit 判断可能是 EventLink 的事件处理程序,其中参数在 HTTP GET 请求中作为查询参数传递。

如果是这种情况,有几种方法可以与应用程序的其他组件/部分共享事件上下文:

  1. Component parameters - 它们实际上是双向绑定,从组件分配参数字段会将值写入参数绑定的位置。当然,该值仅在当前请求的范围内可用,除非字段或关联绑定使用 @Persist

    注释
    class Component1 {
       @Parameter MyClass param1;
    
       onActionFromEdit(MyClass object) {
            param1 = object; // this will update value of a binding
                             // where this parameter is set
       }
    }
    
  2. 如果您想与父组件共享状态,那么您也可以在父组件中@InjectComponent Component1 component1 并直接访问其状态,就像使用常规 Java 对象一样,例如component1.getState1(),当然这必须在事件处理程序从请求分配值之后完成。

  3. Environmental services。这是一个每个请求的服务,它通常是由父组件在渲染/事件处理期间为子/嵌套组件推送状态的用户,例如t:Formt:TextField

  4. 始终可以为具体用例创建专用的 per-thread service,并在需要时@Inject。服务可能在自己的字段中保持共享状态,它将在请求结束时被丢弃。如果您需要自定义逻辑来结束请求清理,该服务也可能register a cleanup listener

同样,很难说为什么你需要这个/你的用例是什么,但 Tapestry 页面支持 activation contexts。每个事件链接都会透明地添加此上下文,因此每次调用事件链接时,包含页面将使用存储的上下文激活,然后可以为组件发布此状态,例如使用常规组件参数,或上述方法之一。 Jumpstart examples for onActivate/onPassivate

还值得一提的是 @ActivationRequestParameter,您可以在 JumpStart 中找到更多使用示例。

如果您需要在多个请求中捕获数据并与应用程序的其他部分共享数据,还可以使用 Session Storage。但你的问题听起来太过分了。

还有其他非 Tapestry 的数据共享方式也适用于 Tapestry 应用程序,例如请求属性、查询参数等。但您通常不会使用它们。