0

考虑以下场景。有一个带有一些持久对象的页面obj

public class SomePage {
   @Persistent
   @Property
   SomeBean obj;

   @Property
   @PageActivationContext
   private SomeActivation actObj;

   ...

   void onValidateFromForm() { ... }
}

obj是在页面上编辑的:

<t:textfield t:id="value" t:value="obj.value"/>

让我们考虑如下状态的初始化过程obj

(*) obj.value = actObj.value;

(我强烈需要解除绑定valueactObj请不要问为什么)。

还有一个验证方法。当验证失败时,我想在页面上显示错误列表并保留所有值,用户填写表单并存储到obj.

所以:

  1. 当页面第一次用特定初始化时,actObj我想初始化obj
  2. 当页面验证失败时,我不想重新初始化obj,因为我想保留它的值并向用户显示错误列表。

问题是:我应该在哪里放置初始化块(*)

4

2 回答 2

0

您可以使用激活处理程序而不是注释,因此:

@Persistent
@Property
private SomeBean obj;

@Property
private SomeActivation actObj;

@OnEvent(EventConstants.ACTIVATE)
void activatePage(SomeActivation actObj) {
  this.actObj = actObj;
  if (obj == null) {
    obj = // initialize
    obj.value = actObj.value
  }
}

@OnEvent(EventConstants.PASSIVATE)
Object passivatePage() {
  return actObj;
}

@OnEvent(value = EventConstants.SUCCESS, component = "form")
void success() {
  // do some staff

  // reset obj
  obj = null;
}

@OnEvent(value = EventConstants.FAILURE, component = "form")
void failure() {
  // do some staff
}
于 2013-07-12T13:49:44.607 回答
0

您应该能够使用 onActivate() ,因为这将在应用请求参数之前发生。因此,您的提交事件将首先设置激活上下文中的值,然后用文本字段中的值覆盖它。

请注意,tapestry 仅在验证成功后才进行重定向。当验证失败时,tapestry 会在 POST 响应中呈现错误。出于这个原因,您可能会发现您根本不需要 @Persist 并且可以通过 @PageActivationContext / onActivate() / onPassivate() 进入无状态状态

于 2013-07-12T13:45:18.420 回答