当用户单击span元素并从jQuery更新当前XML实例时,我想在JavaScript中执行一些逻辑:
(我在网上看到2个类似的问题,但从未得到回答!)
XForms:
<xhtml:span class="buttonPlusOne" id="plusVat">+</xhtml:span>
<xf:output ref="instance('submitted_instance')/TotVATAmnt"></xf:output>
<xf:input id="changeVatTotal" ref="instance('submitted_instance')/TotVATAmnt"></xf:input>
JavaScript:
$('span.buttonPlusOne').on('click', function () {
// do some logic and increment value for 0.01
orbeonElId = $(this).siblings('#changeVatTotal').children('input').attr('id');
// alert(orbeonElId) produces right id (changeVatTotal$xforms-input-1)
// alert(newValue) produces 0.02 (for example)
ORBEON.xforms.Document.setValue(orbeonElId, newValue);
});
我可以看到Orbeon发布数据(Firebug),但是XML实例没有得到更新(输入不会更新输出-即使它们共享相同的“ ref”属性)。
最佳答案
我想您正在将html元素的ID与id
元素的XForms id(xf:input
属性)混合在一起。
Orbeon文档shows an example:ORBEON.xforms.Document.setValue()
函数调用中使用的ID是(服务器端)XForms元素的ID。因此,在您的示例中,它是changeVatTotal
,而不是(客户端)html输入元素changeVatTotal$xforms-input-1
的ID。这就是为什么有一个请求显示在Firebug中而对XForms实例无效的原因:服务器端XForms引擎找不到ID为xf:input
的changeVatTotal$xforms-input-1
元素,因此它不知道该怎么做该请求。
同样,这也意味着您(通常)不需要计算目标元素的id,而只需使用xf:input的“普通” XForms id属性值即可。
或者:
是否可以在XForms中完全处理“加号”按钮?您可以使用xforms:trigger
control并在xforms:setvalue
事件上包含DOMActivate
操作:
<xf:trigger>
<xf:label>+</xf:label>
<xf:setvalue
ev:event="DOMActivate"
ref="instance('submitted_instance')/TotVATAmnt"
value="0.01 + instance('submitted_instance')/TotVATAmnt" />
<.... more actions ...>
</xf:trigger>
我认为此解决方案比在客户端和服务器端进行某些工作更稳定。