我正在尝试创建一个表单,我希望在各个字段上立即进行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调用:
至少在IE8中,我很可能会收到一个脚本错误,说明“O $ .Tables._initColumns:colTags.length(0)!= colCount(1)”。
问题似乎源于这样一个事实:&lt; o:dropDownField&gt;的javascript初始化组件“推迟”一个或多个步骤,将它们包装在setTimeout()中。
因此,当富表面AJAX处理器认为它已经完成处理第一个请求时,它将开始处理第二个请求。但是当推迟的步骤开始执行时,我现在将有两组的dropDownField初始化代码试图同时完成他们的工作 - 他们踩到彼此的脚趾,我得到脚本错误..
有没有人对如何避免这个问题有任何建议?