如何在valueChangeListener方法中获取更新的模型值?

时间:2013-01-05 11:52:13

标签: jsf valuechangelistener

我遇到了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字段的更新地址。有人可以帮助我解决问题吗?

2 个答案:

答案 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)。