我遇到了valueChangeListener的问题。我在Weblogic 6.0上使用JSF 1.2。
我有一个页面,页面顶部有2个单选按钮,名称为Name1和Name2。单击Name1时,单选按钮下方将显示Name1详细信息(大约30个字段),单击Name2时,将显示Name2详细信息。现在,用户可以更新单击的命名详细信息。例如用户单击Name1并更改地址字段,然后单击Name2并更改Name2的年龄。当用户点击Name1时,地址应显示更新为新值,当用户点击Name2时,应更新年龄。
我使用了valueChangeListener来解决它,因为我需要更改事件的旧值和新值。问题是,当在VALIDATION阶段结束时调用valueChangeListener时,我没有在valueChangeListener方法中获取Name1字段的更新地址。有人可以帮助我解决问题吗?
答案 0 :(得分:17)
,因为在VALIDATION阶段结束时调用了valueChangeListener,我没有在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
之后运行时,更新的模型值将以“通常的方式”提供。
答案 1 :(得分:0)
(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 和一个动作方法,事件将在动作方法之后执行 - 通常不是你想要什么。)
在监听器方法中我是这样使用的:
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)。