0

我的页面上有两个输入组件。他们每个人都有一个转换器(它是一个检查空值的转换器,比如 JSF 需要一个,但由于某些原因我不能使用 jsf 一个,所以我制作了自己的转换器)。

我也有一个ice:selectBooleanCheckbox

<ice:selectBooleanCheckbox
                    styleClass="graUserAppUserGroupAddChk"
                    value="#{userGroupTableNewRecordBean.addNewDomain}"
                    partialSubmit="true"
                    immediate="true"
                    valueChangeListener="#{userGroupTableNewRecordBean.addDomainListener}"></ice:selectBooleanCheckbox>

如您所见,我immediate=true在其上添加了属性,因为当我选择此复选框时,我确实希望跳过转换阶段但它不起作用,转换器仍然显示它们的警告。你知道为什么吗?

我还在此复选框上添加了一个 valueChangeListener 并根据此引用直接调用了 renderResponse:

So in the value changed listener method for the dropdown lists, just 

从 FacesContext 对象调用 renderResponse() ,验证和转换被绕过,你仍然可以做你想做的事。

public void addDomainListener(final ValueChangeEvent valueChangeEvent) {
    // skip validation
    logger.info("listener calleddddddddddddd");
    FacesContext.getCurrentInstance().renderResponse();
}

也许 JSF 大师可以提供帮助?

非常感谢...

更新:我知道解决方案是将复选框放在单独的表格中,但我负担不起......

更新2:我已经更正了一些关于监听器的代码,所以现在它在点击时被调用,但转换器仍然失败并且渲染响应阶段没有完成......

更新3:这不是icefaces问题......我已经尝试过 ah:selectBooleanCheckbox并且它发生了同样的......

4

2 回答 2

3

整个问题和这一切背后的功能需求都非常令人困惑。为什么要使用转换器而不是验证器来验证输入?如果您似乎不关心转换/验证结果,为什么还要使用转换器/验证器?

如您所见,我在其上放置了 immediate=true 属性,因为当我选择此复选框时,我确实希望跳过转换阶段但它不起作用,转换器仍然显示它们的警告。

放置immediate="true"输入组件不会跳过转换/验证。他们只是将转换/验证转移到更早的阶段(即它发生在应用请求值阶段而不是验证阶段)。您基本上需要immediate="true"从这些输入中删除并将其放在命令链接/按钮上,以便跳过这些输入的转换/验证。另请参阅调试 JSF 生命周期

好的,我什么时候应该使用 immediate 属性?

如果还不完全清楚,这里有一个总结,其中包含可能有益的真实世界使用示例:

  • 如果UIInput仅在 (s) 中设置,则流程验证阶段将改为在应用请求值阶段进行。使用它来优先验证有UIInput问题的组件。当其中任何一个的验证/转换失败时,非即时组件将不会被验证/转换。

  • 如果UICommand仅设置,则任何组件都将跳过应用请求值阶段直到更新模型值阶段UIInput。使用它跳过表单的整个处理过程。例如“取消”或“返回”按钮。

  • 如果在UIInput和组件中都设置了,则对于没有设置此属性UICommand的任何组件,将跳过应用请求值阶段直到更新模型值阶段。UIInput使用它来跳过对某些字段的整个表单的处理(立即)。例如,登录表单中的“忘记密码”按钮带有必填但非即时的密码字段。

于 2011-06-16T11:13:21.093 回答
0

终于解决了...

我在这里发布问题的总结和解决方案。

我的弹出窗口中有一个复选框。当我选择它时,我想显示一些隐藏字段,但这不起作用,因为我在同一页面上也有两个必填字段,所以出现了 jsf PROCESS_VALIDATIONS 阶段......

我以为推杆immediate=true会解决这个问题,但它没有......

因此,在复选框的 ValueChangeListener 中,我必须手动跳过jsf 验证阶段:

public void addDomainListener(final ValueChangeEvent valueChangeEvent) {
        // skip validation
        final PhaseId phaseId = valueChangeEvent.getPhaseId();
        final Boolean newValue = (Boolean) valueChangeEvent.getNewValue();
        if (phaseId.equals(PhaseId.ANY_PHASE)) {
            valueChangeEvent.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
            valueChangeEvent.queue();

            this.addNewDomain = newValue;
            FacesContext.getCurrentInstance().renderResponse();
        }
    }
于 2011-06-16T10:03:33.677 回答