Как сделать что-то с выбранными значениями xforms: выбирать каждый раз, когда они меняются? - PullRequest
2 голосов
/ 26 сентября 2011

У меня проблема с XForms, которые я использую в Orbeon Forms. Я использую fr:box-select элемент управления следующим образом:

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

Однако это не совсем то, что мне нужно. Я мог бы сделать эту работу, но это потребовало бы намного больше работы, потому что мне нужно знать, какие из них отменены, чтобы изменить отображение для пользователя.

Ответы [ 2 ]

3 голосов
/ 27 сентября 2011

Поскольку в вашем случае вам не нужно конкретно знать, какое значение изменилось, вы можете при изменении значения сбросить все значения в 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>

Также см. полный исходный код примера, использующего приведенный выше фрагмент.

0 голосов
/ 27 сентября 2011

Вы можете использовать события ev: event = "xforms-select" и ev: event = "xforms-deselect".

Также выбранное значение может быть зафиксировано с помощью события ('xxforms: item-value')

Вот как это можно использовать, если кому-то интересно:

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