我遇到了valueChangeListener的问题。我在Weblogic 6.0上使用JSF 1.2。
我有一个页面,在页面的顶部有2个单选按钮,名称为Name1和Name2。当单击Name1时,将在单选按钮下方显示Name1的详细信息(大约有30个字段),当单击Name2时,将显示Name2的详细信息。现在,用户可以更新单击的命名详细信息。例如,用户单击Name1并更改地址字段,然后单击Name2并更改Name2的年龄。当用户单击Name1时,地址应该显示为更新后的新值,当用户单击Name2时,年龄应该更新。
我已经使用valueChangeListener来处理它,因为我需要更改事件的旧值和新值。问题是,由于valueChangeListener是在VALIDATION阶段结束时调用的,所以我没有获得valueChangeListener方法中Name1字段的更新地址。有没有人能帮我解决这个问题?
当valueChangeListener在VALIDATION阶段结束时被调用时,我没有获得valueChangeListener方法
中Name1字段的更新地址。
将事件排队到INVOKE_ACTION
阶段,这样它就像一个操作(侦听器)方法。
public void valueChangeListenerMethod(ValueChangeEvent event) {
if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
event.setPhaseId(PhaseId.INVOKE_APPLICATION);
event.queue();
return;
}
// Do your original job here.
// It will only be entered when current phase ID is INVOKE_APPLICATION.
}
由于INVOKE_ACTION
阶段在UPDATE_MODEL_VALUES
阶段之后运行,更新后的模型值将"按常规方式"可用。
(扩展到BalusC应答)
正如我在BalusC回答的评论中所指出的,这里的支持方法与使用示例:
public static boolean moveToEndOfUpdateModel(FacesEvent event) {
if (event.getPhaseId() == null || event.getPhaseId().getOrdinal() < PhaseId.UPDATE_MODEL_VALUES.getOrdinal()) {
// see UIViewRoot.processUpdates(): first components.processUpdates(), then broadcastEvents()
event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
event.queue();
return true;
}
return false;
}
(并由我重复相关更改的原因:
事件被放置在队列的末端,因此,如果您将valueChangeEvent与操作方法一起使用,则事件将在操作方法之后执行(通常不是您想要的)
在listener方法中,我这样使用它:
public void myValueChangeMethod(ValueChangeEvent vce) {
if (JSFUtils.moveToEndOfUpdateModel(vce)) return;
// ... perform my actions here, with access to already updated bean values ...
}
对于JSF 2+,您可以更好地使用<f:ajax listener="...">
—如果您不被迫使用不支持此功能的组件库(如旧的Trinidad)。