2011-09-26 97 views
2

我在Orbeon Forms上運行的XForms中遇到了這個問題。我使用的是fr:box-select控制如下:如何使用xforms的選定值執行某些操作:每次選擇它們時都要進行選擇?

<fr:box-select bind="box-select-bind" id="box-select-control"> 
     <xforms:action ev:event="xforms-value-changed"> 
     <xxforms:variable name="selected-value" select="."/> 
     <xforms:message level="modal">Hello:<xforms:output select="$selected-value" /> 
     </xforms:message> 

     </xforms:action> 

     <xforms:itemset nodeset="instance('codes')/box-select/item"> 
            <xforms:label ref="label"/> 
            <xforms:value ref="value"/> 
     </xforms:itemset> 
    </fr:box-select> 

的結合是一個簡單的XML文件:

<box-results></box-results> 

的代碼XML看起來像:

<box-select> 
    <item> 
     <label>Cat</label> 
     <value>cat</value> 
    </item> 
    <item> 
     <label>Dog</label> 
     <value>dog</value> 
    </item> 
    <item> 
     <label>Bird</label> 
     <value>bird</value> 
    </item> 
    <item> 
     <label>Fish</label> 
     <value>fish</value> 
    </item> 
</box-select> 

當我檢查中的條目框中,我的節點<box-results>獲得更新,所選值由空格分隔,這似乎是預期的。但是,我似乎無法找到有關如何處理選定值的任何文檔。我想要訪問剛剛選擇的值,取消選擇並在xpath中使用此項的值。所以,如果選擇了值,那麼我這樣做:

<setvalue 
ref="somexpath[id=$selected-value]/display 
value="'true'"/> 

如果這個值是取消我這樣做:

<setvalue 
ref="somexpath[id=$selected-value]/display 
value="'false'"/> 

基本上,我只是想知道的情況下使用,以及在火災發生時如何獲得價值。然後我想在xpath中使用這個值。我將使用它來隱藏/顯示錶單的一部分。使用xforms-value-changed事件Xpath「。」不會像我在「select1」控件中那樣返回我所期望的。

我可以遍歷所有被選擇的,像這樣的價值觀:

<xforms:action ev:event="xforms-select" xxforms:iterate="for $s in tokenize(instance('data-inst')/box-results,'\s')return xxforms:element('text',$s)"> 
    <xforms:message level="modal">Hello selected:<xforms:output select="$s" /> 
</xforms:action> 

然而,這不正是我需要的。我可能能夠完成這項工作,但這需要更多的工作,因爲我需要知道哪些內容被取消選擇來更改用戶的顯示內容。

回答

3

因爲在你的情況下,你不需要具體知道哪個值發生了變化,你可以根據需要在值更改時重置somexpath[id=$selected-value]中的所有值。您可以與使用剛剛<xforms:setvalue>xxforms:iterate下面的代碼做到這一點:

<xforms:action ev:event="xforms-value-changed"> 
    <xxforms:variable name="selected-values" select="tokenize(., '\s+')"/> 
    <xforms:setvalue xxforms:iterate="instance('codes')/item" 
        ref="@selected">false</xforms:setvalue> 
    <xforms:setvalue xxforms:iterate="$selected-values" 
        ref="for $v in . return instance('codes')/item 
        [value = $v]/@selected">true</xforms:setvalue> 
</xforms:action> 

還查看使用上面的代碼示例的the full source

+0

嘿,感謝您回覆。這正是我想要做的,但是想看看是否有辦法獲得選定/取消選擇的單個項目。我沒有意識到你可以使用setvalue命令的迭代,謝謝!有一件事。我無法獲得使用「。」的標記大小。 xpath,我不得不去我的實例中存儲數據,像這樣:select =「tokenize(instance('codes')/ box-results,'\ s +')」。不知道這是爲什麼,但它以任何速度工作。再次感謝您向我展示了一些關於orbeon我不知道的事情。 – devo

+0

右鍵:對於XBL組件,與常規XForms控件不同,事件處理程序運行的上下文不會被組件上的'ref'屬性更改。在我的例子中,它的作用是「機會」,因爲我有一個不改變上下文的'「。但是在更一般的情況下,你是對的:你不能在事件處理函數中使用'.',並且指望這是''所綁定的節點。 – avernet

+0

要完成@ avernet的評論:這裏的XPath上下文的行爲是一個錯誤。 – ebruchez

0

您可以使用ev:event =「xforms-select」和ev:event =「xforms-deselect」events。

而且所選擇的值可以使用事件(「xxforms:項目價值」)被捕獲

這裏是如何將它的情況下,任何人使用的疑惑:

<xforms:action ev:event="xforms-select"> 
<xxforms:variable name="selected" select="event('xxforms:item-value')" /> 
<xforms:message level="modal">Select:<xforms:output value="$selected" /></xforms:message> 
</xforms:action> 

<xforms:action ev:event="xforms-deselect"> 
<xxforms:variable name="deselected" select="event('xxforms:item-value')" /> 
<xforms:message level="modal">deSelect:<xforms:output value="$deselected" /> 
</xforms:message> 
</xforms:action> 
+0

謝謝,這也很好。我用一個例子更新了你的帖子。順便說一句,你在哪裏找到了這個?我在orbeon xforms上找到文檔時遇到問題。 – devo

+0

是的..我通常谷歌很多,因爲我無法找到一個單一的地方的所有文件。你可以在這裏找到上面使用的元素。 http://wiki.orbeon.com/forms/doc/developer-guide/xforms-events – Jayy

相關問題