2

当用户单击 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”属性)。

4

1 回答 1

3

我假设您将 html 元素的 id 与该元素的 XForms id(id属性)混为一谈xf:input

Orbeon 文档显示了一个示例ORBEON.xforms.Document.setValue()函数调用中使用的 id 是(服务器端)XForms 元素的 id。因此,在您的示例中,它是changeVatTotal,而不是(客户端)html 输入元素的 id changeVatTotal$xforms-input-1。这就是为什么在 firebug 中显示一个对 XForms 实例没有影响的请求的原因:服务器端 XForms 引擎找不到xf:input具有 id 的元素changeVatTotal$xforms-input-1,因此它不知道如何处理该请求。

这也意味着,您(通常)不需要计算目标元素的 id,而只需使用 xf:input 的“普通”XForms id 属性值。

或者:

是否可以在 XForms 中完全处理“加号”按钮?您可以使用xforms:trigger控件并包含xforms:setvalueDOMActivate事件的操作:

<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>

我认为这个解决方案会比在客户端和服务器端做一些工作更稳定。

于 2012-05-11T11:58:31.533 回答