2015-06-21 46 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>