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



我遇到了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)。

相关内容

  • 没有找到相关文章

最新更新