2015-06-21 45 views
0

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

回答

1

你可以使用xxf:valid() function,指着你想成为有效的节点。您也可以将该函数指向“父”节点,并要求它检查该节点有效的“下”的所有内容。

我认为这个函数可以做你正在寻找的东西,但是因为字段值只在用户脱离现场时发送,所以这可能会产生一些意想不到的用户体验。例如,想象您的表单的最后一个字段显示在按钮之前,是必需的。用户关注该字段并键入一个值。此时该按钮仍处于禁用状态,因为该值尚未发送到服务器。现在,用户点击标签,将值发送到服务器,当收到Ajax响应时该按钮将变为启用状态,但由于在按下按钮时没有启用按钮,焦点会在按钮之外进行,这有些出乎意料。所以,这是要记住的。

+0

您引用的页面结束了它的段落:“这意味着默认情况下使用xxf:valid()来控制,例如,按钮是只读还是相关不起作用。”。 我试过了,通过省略父xforms:组并替换为: .. 这使得按钮出现和消失,并在输入上结合递增=“真”来排序。更好的办法是激活/关闭,但保持按钮在视线内。有什么想法吗? –

+1

@AlexanderHenket您可以禁用触发器而不是隐藏它,方法是在某些情况下使用始终只读的节点。假设它是'instance('private')/ readonly'。然后你会写:'ref =“if(xxforms:valid(instance('new-terminology-association'),true()))then。else instance('private')/ readonly”>'。 – avernet

+1

@AlexanderHenket此外,如果您使用的是4.x版本,我建议您只使用''而不是''。 ''最初被添加来使按钮看起来更好,但现在不再需要它们了,因为我们可以通过普通按钮上的CSS获得相同的结果。 – avernet

0

Orbeon 4.7绝对没有办法让按钮/触发器直接响应xxf:valid。这看起来像是一个bug。解决方法代码:在新实例中为xxforms-valid和xxforms-invalid添加observer,以设置true | false。为该实例添加基于“。='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>