使用RichFaces进行字段和表单验证

时间:2013-10-01 11:11:58

标签: richfaces jsf-1.2 openfaces

我正在尝试创建一个表单,我希望在各个字段上立即进行AJAX验证,并使用AJAX处理整个表单

但是我遇到了某些组件的这种方法的问题。例如,< o:dropDownField />来自OpenFaces的组件会导致脚本错误,当它快速重新生成后会多次重新生成。

使用JSF 1.2,RichFaces 3.3.3.Final和OpenFaces 2.0.r13,表单看起来像:

<a4j:queue/>
<h:form>
    <h:panelGroup id="myForm">
        <f:facet name="aroundInvalidField">
            <s:div style="border: 2px solid red"/>
        </f:facet>
        <h:messages/>
        <h:panelGrid id="myGrid" columns="2">
            <s:decorate id="dropDownFieldDecorator">
                <o:dropDownField id="dropDownField"
                                 value="#{controller.library}"
                                 autoComplete="true">
                    <o:dropDownItem value="OpenFaces"/>
                    <o:dropDownItem value="RichFaces"/>
                    <a4j:support event="onchange"
                                 ajaxSingle="true"
                                 reRender="dropDownFieldDecorator"/>
                </o:dropDownField>
            </s:decorate>
            <a4j:commandButton value="Save"
                               action="#{controller.save}"
                               reRender="myForm"/>
        </h:panelGrid>
    </h:panelGroup>
</h:form>

如果我在dropDownField的输入中写了一些内容(并将焦点留在那里),然后单击“保存”按钮,我将立即得到两个AJAX调用:

  • 一个用于dropDownField上的change事件,
  • 一个用于“保存”按钮。

至少在IE8中,我很可能会收到一个脚本错误,说明“O $ .Tables._initColumns:colTags.length(0)!= colCount(1)”。

问题似乎源于这样一个事实:&lt; o:dropDownField&gt;的javascript初始化组件“推迟”一个或多个步骤,将它们包装在setTimeout()中。

因此,当富表面AJAX处理器认为它已经完成处理第一个请求时,它将开始处理第二个请求。但是当推迟的步骤开始执行时,我现在将有两组的dropDownField初始化代码试图同时完成他们的工作 - 他们踩到彼此的脚趾,我得到脚本错误..

有没有人对如何避免这个问题有任何建议?

0 个答案:

没有答案
相关问题