【问题标题】:XFORMS multiple select option binding issueXFORMS 多选选项绑定问题
【发布时间】:2011-02-20 11:25:44
【问题描述】:

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

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

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

【问题讨论】:

    标签: xforms orbeon


    【解决方案1】:

    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>
    

    【讨论】:

      【解决方案2】:

      select 元素无法满足您的要求,因为它只有一个节点绑定。我不会尝试以这种方式颠覆控件的语义,而是使用带有 insertdelete 动作的 repeat 元素 repeat选择控件。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-11
        • 2013-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多