12.4. 不得不说的immediate属性

对于设置了immediate属性为true的构件来说,如果继承了EditableValueHolder(例如UIInput),则其转换与校验动作将在应用请求值阶段(生命周期的第二阶段)进行(包括可能激活ValueChangeEvent事件)。

如果继承了ActionSource(例如UICommand),则这构件被触发后所产生的动作事件将在应用请求值阶段(生命周期的第二阶段)结束时被分发,否则这个事件将在调用应用程序阶段(生命周期的第五阶段)结束时被分发。

immediate属性的用处有很多,例如我们通常会在表单提交页面放置一个cancle按钮用以清除输入框的内容,我们可能会把这个按钮绑定到后台的一个方法把页面所有属性的值设置为空。但这个操作相当于又向服务器

端发送了一个请求,也就是说点击了这个cancle按钮后会伴随着对页面的输入域进行校验。可我们只想清空,不想校验,所以这个时候就可以cancle按钮构件的immediate属性为true,这样cancle构件的事件就会发生

在构件校验之前。

需要注意的是:immediate构件的更新模型值动作仍然会在更新模型值阶段(生命周期的第四阶段)执行,以保证模型数据的一致性,因此在immediate构件的动作事件中(此时动作事件发生在第二阶段),无法通过模型属性来获取绑定构件的取值。

比如页面有个输入框,在后台绑定了一个String类型的属性,页面的提交按钮设置了immediate属性:

<w:textField id="name"></w:textField>
<w:button value="submit" id="submit" immediate="true" />
@Bind(id="name",attribute="value")
private String name;
@Action
public void submit(){
   1System.out.println(name);
}
1

submit()方法中获取不到name属性的值。

这种情况下可以绑定textField到后台一个UITextField构件类的实例,然后调用该实例的getSubmittedValue()方法获取textField的提交值:

@Bind(id="name",attribute="binding")
1private UITextField name;
@Action
public void submit(){
     2System.out.println((String)name.getSubmittedValue(););
}
1

绑定页面的textField到后台的构件类。

2

从构件类的getSubmittedValue方法中获取页面的textField提交的未经校验的值。