10

我在 valueChangeListener 上遇到了一个问题。我在 Weblogic 6.0 上使用 JSF 1.2。

我有一个页面,页面顶部有 2 个单选按钮,名称分别为 Name1 和 Name2。单击 Name1 时,单选按钮下方会显示 Name1 详细信息(大约有 30 个字段),单击 Name2 时会显示 Name2 详细信息。现在用户可以更新点击的命名细节。例如,用户单击 Name1 并更改地址字段,然后单击 Name2 并更改 Name2 的年龄。当用户单击 Name1 时,地址应该会显示为使用新值更新,当用户再次单击 Name2 时,应该会更新年龄。

我使用 valueChangeListener 来解决它,因为我需要更改事件的旧值和新值。问题是,在验证阶段结束时调用 valueChangeListener,我没有在 valueChangeListener 方法中获取 Name1 字段的更新地址。有人可以帮我解决任何问题吗?

4

2 回答 2

18

由于在验证阶段结束时调用了 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,更新后的模型值将以“通常的方式”可用。

于 2013-01-05T14:18:03.277 回答
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="...">- 如果您不被迫使用不支持此功能的组件库(如旧的特立尼达)。

于 2021-03-10T08:45:58.987 回答