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

У меня проблема с 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-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>

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


person devo    schedule 26.09.2011    source источник


Ответы (2)


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

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

person avernet    schedule 26.09.2011
comment
Привет, спасибо за ответ. Это то, о чем я думал, но искал, есть ли способ получить доступ к отдельному выбранному / отмененному элементу. Я не понимал, что вы можете использовать итерацию для команды setvalue, спасибо за это! Хотя одно. Мне не удалось получить токениз для использования. xpath, мне пришлось перейти к своему экземпляру, где данные хранятся следующим образом: select = tokenize (instance ('codes') / box-results, '\ s +'). Не уверен, почему это так, но в любом случае это работает. Еще раз спасибо, вы показали мне кое-что об orbeon, которого я не знала. - person devo; 27.09.2011
comment
Справа: для компонентов XBL, в отличие от обычных элементов управления XForms, контекст, в котором запускается обработчик событий, не изменяется атрибутом ref в компоненте. В моем примере это работает случайно, поскольку у меня был <fr:box-select ref=".">, который не меняет контекст. Но в более общем случае вы правы: вы не можете использовать . в обработчике событий и рассчитывать на то, что это узел, к которому привязан <fr:box-select>. - person avernet; 27.09.2011
comment
Чтобы завершить комментарий @avernet: поведение контекста XPath здесь является ошибкой. - person ebruchez; 29.09.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>   
person Jayy    schedule 27.09.2011
comment
Спасибо, это тоже отлично работает. Я обновил ваш пост примером. Кстати, где вы это узнали? Мне не удается найти документацию по orbeon xforms. - person devo; 27.09.2011
comment
Да ... я обычно много гулю, так как не могу найти всю документацию в одном месте. Здесь вы можете найти использованные выше элементы. wiki.orbeon.com/forms/doc/developer-guide/xforms- события - person Jayy; 29.09.2011