实例有效时激活xforms按钮,否则禁用

时间:2015-06-21 13:02:29

标签: orbeon 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>

2 个答案:

答案 0 :(得分:1)

您可以使用xxf:valid() function,指向您想要有效的节点。您还可以将该功能指向&#34;父母&#34;节点,并要求它检查所有内容&#34;&#34;该节点有效。

我认为该功能会执行您正在寻找的功能,但由于字段值仅在用户刺入字段时发送,因此可能会产生一些意外的用户体验。例如,假设您需要在按钮之前显示表单的最后一个字段。用户关注该字段,并键入值。此时按钮仍处于禁用状态,因为尚未将值发送到服务器。现在用户点击选项卡,该值被发送到服务器,当收到Ajax响应时该按钮将被启用,但由于在按下选项卡时没有启用该按钮,因此重点放在除了按钮,这有些出乎意料。所以,这是值得记住的。

答案 1 :(得分:0)

在Orbeon 4.7中绝对没有办法让按钮/触发器直接响应xxf:valid。对我来说这看起来像个错误。解决方法代码:为xxforms-valid和xxforms-invalid添加观察者,在新实例中设置true | false。根据&#34;。=&#39; false&#39;&#34;添加只读绑定对于该实例并使用ref =&#34; instance&#34;在触发器上。在繁忙的表格上有很多按钮,这有点浪费,但它必须到期。谢谢你的帮助,谢谢!

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