2013-07-12 23 views
0

请考虑以下情景。 有一个网页一些持久对象obj挂毯5:永久页面数据的初始化

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,因为我想保留自己的价值观并向用户显示错误列表。

问题是:我应该把初始化块(*)

回答

0

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

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

+0

不,这是行不通的。当我在'onValidateFromForm()'之前改变这个对象的状态时,它总是会从数据库中重新初始化对象的状态,所以我所有的改变都会继续。 – Andremoniy

+0

你确定吗?该值将从数据库中查找,但会立即被请求参数中的字段值覆盖。 –

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 
} 
+0

那么,在这种情况下我应该做什么,当用户点击页面上的其他链接,所以'success()'方法将不会被调用?这样'obj'将不会收到'null'值,并且在新的'onActivate()'事件中它不会被重新初始化。 – Andremoniy

+0

如果你不需要保存这个值,你不需要@Persist – sody

+0

我需要保存这个值直到我使用相同的'actObj'。当'actObj'发生变化时,我需要重新初始化'obj'。 – Andremoniy