Проблема привязки опций множественного выбора XFORMS - PullRequest
2 голосов
/ 20 февраля 2011

У меня есть элемент управления select, который позволяет выбрать более одного значения.

Когда я выбираю значения в этом элементе управления, он добавляет значение в тот же узел с пробелом.

Isвозможно создать / удалить новый / существующий узел, когда мы выбираем и отменяем выбор.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

XForms имеет элемент xforms:copy, который теоретически можно использовать в наборах элементов и который мог бы работать для вас, но я не знаю, поддерживает ли какая-либо реализация XForms это в настоящее время. Orbeon Forms - нет.

Ответ Фила - возможное направление. Другой вариант - по-прежнему использовать xforms:select/select1 и реагировать на события xforms-select/xforms-deselect для вставки / удаления узлов. Следующие работы с Orbeon:

<xh:html xmlns:xh="http://www.w3.org/1999/xhtml"
         xmlns:xf="http://www.w3.org/2002/xforms"
         xmlns:xxf="http://orbeon.org/oxf/xml/xforms"
         xmlns:ev="http://www.w3.org/2001/xml-events">
    <xh:head>
        <xf:model>
            <xf:instance>
                <items selection=""/>
            </xf:instance>
        </xf:model>
    </xh:head>
    <xh:body>
        <xf:select1 ref="@selection">
            <xf:item>
                <xf:label>One</xf:label>
                <xf:value>one</xf:value>
            </xf:item>
            <xf:item>
                <xf:label>Two</xf:label>
                <xf:value>two</xf:value>
            </xf:item>

            <xf:insert ev:event="xforms-select" context="instance()" ref="*" origin="xxf:element(event('xxf:item-value'))"/>
            <xf:delete ev:event="xforms-deselect" context="instance()" ref="*[name() = event('xxf:item-value')]"/>

        </xf:select1>
    </xh:body>
</xh:html>
0 голосов
/ 20 февраля 2011

Элемент select плохо соответствует вашим требованиям, поскольку он имеет привязку только к одному узлу. Вместо того чтобы пытаться нарушить семантику элемента управления таким образом, я бы использовал repeat из trigger элементов с действиями insert и delete, стилизованными с помощью CSS таким образом, чтобы обеспечить вид контроль выбора.

В вашем вопросе не упоминается формат данных, но предполагается, что данные экземпляра выглядят следующим образом:

<xf:instance id="options">
    <options xmlns="">
        <option selected="false">
            <first />
        </option>
        <option selected="false">
            <second />
        </option>
        <option selected="false">
            <third />
        </option>
        <option selected="false">
            <fourth />
        </option>
        <option selected="false">
            <fifth />
        </option>
    </options>
</xf:instance>

<xf:instance id="results">
    <results xmlns="" />
</xf:instance>

Тогда вы сможете получить желаемое поведение с чем-то вроде этого (не проверено):

<xf:repeat id="repeat" nodeset="instance('options')/option">
    <xf:trigger appearance="minimal">
        <xf:label>
            <xf:output value="name(*)" />
        </xf:label>

        <xf:action ev:event="DOMActivate" if="@selected = 'false'">
            <xf:setvalue ref="@selected" value="'true'" />
            <xf:insert
             origin="instance('options')/option[index('repeat')]/*"
             context="instance('results')"
             nodeset="*"
             at="count(../*)"
             position="after"
            />
        </xf:action>

        <xf:action ev:event="DOMActivate" if="@selected = 'true'">
            <xf:setvalue ref="@selected" value="'false'" />
            <xf:delete nodeset="instance('results')/*[name(.) = name(current()/*)]" />
        </xf:action>
    </xf:trigger>
</xf:repeat>
...