XFORMS多选选项绑定问题

时间:2011-02-20 11:25:45

标签: xforms orbeon

我有选择控件,允许选择多个值。

当我在该控件中选择值时,它会将值添加到带有空格的同一节点中。

当我们选择和取消选择时,是否可以创建/删除新的/现有节点。

2 个答案:

答案 0 :(得分:2)

XForms有xforms:copy元素,理论上你可以在itemsets中使用它,它可能对你有用,但我不知道目前是否有任何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>

答案 1 :(得分:0)

select元素与您的要求不匹配,因为它只有一个节点绑定。我不会试图以这种方式破坏控件的语义,而是使用repeat triggerinsert元素与delete<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> 个动作,用CSS设置样式。提供多选控制的外观。

你的问题没有提到数据的格式,而是假设像这样的实例数据:

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

然后你应该能够得到你想要的行为(不测试):

{{1}}
相关问题