当实例有效时激活xforms按钮,否则不激活



我有一个xforms实例,我为它设置了许多绑定,这样我就可以警告用户输入错误。

完成后,他需要能够提交实例中的数据。我想根据实例是否有效在按钮上切换"活动"。

解决这个问题的最佳方法是什么?我目前在按钮周围使用一个组,它基本上重复了模型绑定已经说过的内容,这感觉是多余的,并且由于逻辑不同步而容易出错。

另外:这个实例有3个绑定,但我有其他30-40个绑定。

当前代码:

<xforms:group ref=".[instance('new-terminology-association')[matches(@code,'^S+$')][matches(@codeSystem,'^[0-2](.(0|[1-9][0-9]*))*$')][string-length(@displayName)&gt;0]]">
    <fr:button>
        <xforms:label ref="$resources/create-association"/>
        <xforms:action ev:event="DOMActivate">
            ...
        </xforms:action>
    </fr:button>
</xforms:group>

您可以使用xxf:valid()函数,指向您想要有效的节点。您还可以将该函数指向"父"节点,并要求它检查该节点下的所有内容是否有效。

我认为该函数可以满足您的需求,但由于字段值只有在用户跳出字段时才会发送,因此这可能会产生一些意想不到的用户体验。例如,假设表单的最后一个字段显示在按钮之前,这是必需的。用户关注该字段,并键入一个值。此时,该按钮仍处于禁用状态,因为该值尚未发送到服务器。现在,用户点击选项卡,值被发送到服务器,当收到Ajax响应时,该按钮将被启用,但由于在按下选项卡时该按钮没有被启用,因此重点放在按钮之外的其他东西上,这有点出乎意料。所以,这是需要记住的。

Orbeon 4.7中绝对没有办法让按钮/触发器直接响应xxf:valid。这对我来说像是一个bug。解决方法代码:在新实例中为设置true|false的xxforms-valid和xxforms-invalid添加observer。为该实例添加基于".='false'"的只读绑定,并在触发器上使用ref="instance"。在一个有很多按钮的繁忙表单上,这有点浪费,但它必须到期。谢谢你的帮助,谢谢!

<xf:instance id="button-control">
    <button btn-term-add="false"/>
</xf:instance>
<xf:action ev:event="xxforms-invalid" ev:observer="new-terminology-association">
    <xf:setvalue ref="instance('button-control')/@btn-term-add" >false</xf:setvalue>
</xf:action>
<xf:action ev:event="xxforms-valid" ev:observer="new-terminology-association">
    <xf:setvalue ref="instance('button-control')/@btn-term-add">true</xf:setvalue>
</xf:action>
<xf:bind nodeset="instance('button-control')">
    <xf:bind ref="@btn-term-add" readonly=".='false'"/>
</xf:bind>
....
<xf:trigger ref="instance('button-control')/@btn-term-add">
    ....
</xf:trigger>

最新更新