我有一个场景,其中Orbeon表单是从后端通过用户在前一个(非Orbeon)页面上输入的一些值预先填充的。正在预填充的字段实际上是自动填充字段(使用表单生成器创建)。
每个字段的自动填充建议由我的后端控制器提供。我已经做了一个解决方法,允许用户保留他输入的数据,即使它在原始项目集中不存在。唯一的例外是邮政编码,其中发生了另一个外部验证,并在用户输入的内容与后端项目集不匹配时显示错误。
此外部验证是通过服务实现的,该服务在更改邮政编码字段时调用,该服务使用值隐藏字段(例如 postalCodeValidationResult ) > true / false 我实际上是根据 true / false 值 postalCodeValidationResult 字段检查输入的邮政编码是否有效。
E.g。用户在页面A上输入邮政编码,城市和街道,然后输入 到达页面B,这些值必须在匹配时预先填充 在页面B上的Orbeon表格上的字段。由于邮政编码需要是真实的 一,我需要以某种方式触发邮政编码的外部验证 字段(即调用外部服务进行验证)。
我遇到的问题是当用户在页面A上输入错误的邮政编码时,我会在页面B上填充它,并且应该在表单加载时以某种方式触发验证。但是,我无法成功触发验证。我假设我必须触发 xforms-value-changed 事件或类似事件,但这似乎不起作用,或者我遗漏了一些东西。我试过了:
ORBEON.xforms.Document.dispatchEvent(
{
targetId: 'address-postal-code-control',
eventName: 'xforms-value-changed'
}
);
还有这个:
var control = ORBEON.jQuery('*[id $= "address-postal-code-control"]');
ORBEON.xforms.Document.dispatchEvent(
{
targetId: control.attr('id'),
eventName: 'xforms-value-changed'
}
);
但没有成功。在测试时,我还尝试手动更改JavaScript中的值(而不是预先填充),但即使这样也行不通 - 是因为它不是常规输入字段,而是自动填充字段?
ORBEON.xforms.Document.setValue(control.attr('id'), "69121");
有人知道如何实现这一目标吗?感谢任何帮助。谢谢。
其他信息(自动填充定义)
<fr:autocomplete xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:xxbl=""http://orbeon.org/oxf/xml/xbl""
id=""address-postal-code-control"" labelref=""@label""
resource=""$config-gev.autosuggest.url.address/autosuggest/zurs?facet=postalCode&postalCode={$fr-search-value}""
bind=""address-postal-code-bind""
class=""personal-details-input address-postal-code"">
<xf:label ref=""$form-resources/address-postal-code/label""/>
<xf:hint ref=""$form-resources/address-postal-code/hint""/>
<xf:alert ref=""$form-resources/address-postal-code/alert[1]"" validation=""validation-68-validation""/>
<xf:itemset ref=""/suggestions/suggestion"">
<xf:label ref=""result""/>
<xf:value ref=""result""/>
</xf:itemset>
</fr:autocomplete>
其他信息(验证操作)
<xf:action id=""validatePostalCode-regular-binding"">
<xf:action ev:event=""xforms-value-changed"" ev:observer=""address-postal-code-control"" if=""true()"">
<xf:send submission=""validatePostalCode-submission""/>
</xf:action>
<xf:action ev:event=""xforms-submit"" ev:observer=""validatePostalCode-submission"">
<xf:var name=""request-instance-name"" value=""'validatePostalCode-instance'"" as=""xs:string""/>
<xf:insert ref=""instance('fr-service-request-instance')"" origin=""saxon:parse(instance($request-instance-name))""/>
<xf:action context=""instance('fr-service-request-instance')"">
<xf:action class=""fr-set-service-value-action"">
<xf:var name=""control-name"" value=""'address-postal-code'""/>
<xf:var name=""path"" value=""/request/postalCode""/>
</xf:action>
<!-- Setvalue actions will be here -->
</xf:action>
</xf:action>
<xf:action ev:event=""xforms-submit-done"" ev:observer=""validatePostalCode-submission"" context=""instance('fr-service-response-instance')"">
<xf:action class=""fr-set-control-value-action"">
<xf:var name=""control-name"" value=""'postalCodeValidationResult-regular'""/>
<xf:var name=""control-value"" value=""/result/valid""/>
</xf:action>
</xf:action>
</xf:action>