我有一个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)>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>