当用户单击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 exampleORBEON.xforms.Document.setValue()函数调用中使用的ID是(服务器端)XForms元素的ID。因此,在您的示例中,它是changeVatTotal,而不是(客户端)html输入元素changeVatTotal$xforms-input-1的ID。这就是为什么有一个请求显示在Firebug中而对XForms实例无效的原因:服务器端XForms引擎找不到ID为xf:inputchangeVatTotal$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>


我认为此解决方案比在客户端和服务器端进行某些工作更稳定。

09-25 18:19